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



我使用此代码从映射容器中删除等于某个 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 程序中,程序会冻结/循环或其他东西。我该如何解决这个问题?

erase()

使for循环使用的迭代器无效。幸运的是,erase()本身将迭代器返回到下一个条目,因此正确的循环将如下所示:

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;
});

最新更新