通过for循环从C ++映射中删除元素

时间:2011-03-04 09:00:27

标签: c++ map stl c++11

我的STL有点生疏,请原谅我提出一个可能微不足道的问题。请考虑以下代码:

map<int,int> m;
...
for (auto itr = m.begin(); itr != m.end(); ++itr) {
    if (itr->second == 0) {
        m.erase(itr);
    }
}

问题是:在地图上循环时擦除元素是否安全?

3 个答案:

答案 0 :(得分:23)

是的,但不是你这样做的方式。擦除时会使itr无效,然后递增无效的迭代器。

auto itr = m.begin();
while (itr != m.end()) {
  if (itr->first == 0) {
    m.erase(itr++);
  } else {
    ++itr;
  }
}

答案 1 :(得分:11)

我认为您根本不应该使用已删除的迭代器 - 如果列表导致严重问题,则地图不应该有所不同。

Matthieu M的

EDIT :这段代码在C ++ 0x中格式良好,并且允许作为MSVC的扩展。

map<int,int> m;
...
auto itr = m.begin();
while (itr != m.end())
{
    if (itr->second == 0) {
        itr = m.erase(itr);
    }
    else 
    {
        itr++;
    }
}

答案 2 :(得分:8)

对于给出的示例,实际上使用 erase 重载更容易,该重载将键作为参数。此函数使用给定键擦除地图中的所有元素(对于地图,此值始终为零或一个元素)

map<int,int> m; 
// ...
m.erase(0); // erase all elements with key equivalent to 0