C++ 地图容器erase() 分段错误

Mbr*_*roo 0 c++ stdmap

我使用此代码从地图容器中删除等于某个 int 的元素。

for(auto x:m){
  if((x.second)==element)m.erase(x.first);
}
Run Code Online (Sandbox Code Playgroud)

结果是分段错误。我也试过这个:

for(map<int,int>::iterator i=m.begin();i!=m.end();i++){
  if((i->second)==element)m.erase(i);
}
Run Code Online (Sandbox Code Playgroud)

结果一样。如果将 i++ 放入 if/else 程序将冻结/循环或其他什么。我怎样才能解决这个问题?

joh*_*ohn 5

erase()使for循环使用的迭代器无效。幸运的是,erase()它本身返回一个迭代器到下一个条目,所以正确的循环看起来像这样:

for (map<int,int>::iterator i = m.begin(); i != m.end(); )
{
    if (i->second == element)
        i = m.erase(i);
    else
        ++i;
}
Run Code Online (Sandbox Code Playgroud)