关于此处提供的答案:How to call erase with a reverse iterator
在g++ 4.8.4中使用-std = c++ 11编译时,以下结果会导致段错误(在++it
上)。我误会答案了吗?
std::map<int,int> testmap;
testmap[0] = 1;
for(auto it=testmap.rbegin(); it!=testmap.rend(); ++it) {
testmap.erase( std::next(it).base() );
}
最佳答案
erase
使迭代器无效,您必须从擦除的返回中重建它:
it = std::map<int,int>::reverse_iterator(testmap.erase( std::next(it).base() ));
或(c++ 11)
it = decltype(it){testmap.erase( std::next(it).base() )};
Demo。
为了完整起见,这是原始问题的更正循环的样子(注意,迭代器增量已从
for(...)
中删除:for (auto rit = testmap.rbegin(); rit != testmap.rend(); /* empty */) {
if (WE_WANT_TO_ERASE(it)) {
rit = decltype(rit){ testmap.erase(std::next(rit).base()) };
} else {
++rit;
}
}