void main() {
map<int, int> m;
m[1] = 1;
m[2] = 1;
for (auto it : m) {
cout<<"current: "<<it.first<<endl;
m.erase(1);
m.erase(2);
}
}
猜猜该循环执行了多少次?是2!
但是,如果删除“ m.erase(1)”,则循环执行一次。
我对为什么循环执行两次感到困惑?
答案 0 :(得分:2)
std::map::erase
将使迭代器对被删除的元素无效。之后,无效的迭代器将用于for range循环中的增量操作,从而调用未定义的行为。因此,您基本上无法确定执行循环的次数。
正确的代码段如下所示:
for(auto it = m.begin(); it != m.end(); )
if( /*condition */ )
it = m.erase(it);
else
++it;
答案 1 :(得分:0)
我对为什么循环执行两次感到困惑?
循环中的擦除操作会使循环中使用的迭代器无效。使用无效迭代器的行为是不确定的。