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;
});
我使用此代码从地图容器中删除等于某个 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;
});