C ++在擦除时循环遍历地图

时间:2013-11-21 16:34:48

标签: c++

要在c ++中循环遍历地图,我们就像这样

map<string,int> mymap;
map<string,int>::iterator it= mymap.begin();
while(it!=mymap.end()) {
   //code here
   it++;
}

如果在“代码在这里”部分我有一个if语句,如果评估为true,它会从地图中删除一个元素怎么办?我的代码应如何更改,以便它仍按顺序遍历所有 mymap 元素?

3 个答案:

答案 0 :(得分:5)

http://en.cppreference.com/w/cpp/container/map/erase

  

擦除元素的引用和迭代器无效。其他   引用和迭代器不受影响。

(因此,请确保在删除之前递增并保存“下一个”迭代器

编辑:事实上,自C++11以来,erase无论如何都会返回下一个迭代器,所以你可以使用它。)

答案 1 :(得分:2)

你可能想在删除一个元素时重新分配你的迭代器,因为它不会有效......否则......

it = mymap.erase(...)

答案 2 :(得分:2)

为避免在擦除时使用迭代器使用迭代器,循环体应如下所示:

if (should_erase) {
    it = my_map.erase(it); // C++11: returns the next iterator
    my_map.erase(it++);    // Historic C++: no helpful return value
} else {
    ++it;
}