关于此处提供的答案:How to call erase with a reverse iterator
在带有 -std=c++11 的 g++ 4.8.4 中编译时,以下结果会导致段错误(在 ++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
使迭代器无效,你必须从 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(rit)) {
rit = decltype(rit){ testmap.erase(std::next(rit).base()) };
} else {
++rit;
}
}
关于c++ - 如何使用 for 循环通过反向迭代器调用删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37005449/