我的STL有点生疏,请原谅我提出一个可能微不足道的问题。请考虑以下代码:
map<int,int> m;
...
for (auto itr = m.begin(); itr != m.end(); ++itr) {
if (itr->second == 0) {
m.erase(itr);
}
}
问题是:在地图上循环时擦除元素是否安全?
答案 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