【发布时间】:2011-07-08 16:16:32
【问题描述】:
我的 STL 有点生疏,所以请原谅我问了一个可能微不足道的问题。考虑以下代码:
map<int,int> m;
...
for (auto itr = m.begin(); itr != m.end(); ++itr) {
if (itr->second == 0) {
m.erase(itr);
}
}
问题是:在地图上循环时擦除元素是否安全?
【问题讨论】:
-
再想一想,我可能应该使用
remove_if之类的东西。但是,我仍然对问题的答案感兴趣。 -
我不明白 - 为什么你需要一个循环呢?一个映射只能包含一个值为 0 的键。因此,如果找到了
find,则该迭代器的erase应该可以解决问题! -
尼姆,我的例子有点愚蠢。一个更好的例子是
if (itr->second == 0) -
@Ben,啊——现在不一样了! ;)
-
@Ben:你不应该在排序范围上使用
remove_if,它通过重新排列元素违反了“排序”假设。