C++ 映射容器 erase() 分段错误

C++ map container erase() segmentation fault

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

for(auto x:m){
  if((x.second)==element)m.erase(x.first);
}

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

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

同样的结果。如果你将 i++ 放入 if/else 程序将 freeze/loop 或其他东西。我该如何解决这个问题?

erase() 使 for 循环使用的迭代器无效。幸运的是,erase() 本身 returns 是指向下一个条目的迭代器,因此正确的循环应该是这样的:

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

除了@john 的回答之外,如果您的 C++ 标准库实现支持它,您可以调用 std::erase_if(map, condition) 帮助程序:

std::erase_if(m, [](const auto& item) {
    auto const& [key, value] = item;
    // Write your erasing condition here, e.g.:
    // return value == element;
});