C++在擦除时循环通过映射

C++ loop through map while erasing

本文关键字:映射 循环 擦除 C++      更新时间:2023-10-16

要在c++中循环通过一个映射,我们会做类似于的事情

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

如果在"这里的代码"部分中,我有一个if语句,如果求值为true,它会从映射中删除一个元素,会怎么样?我的代码应该如何更改,以便它仍然按顺序循环通过所有mymap元素?

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

对已擦除元素的引用和迭代器无效。另外引用和迭代器不受影响。

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

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

您可能需要在擦除元素时重新分配迭代器,否则它将无效。。。

it = mymap.erase(...)

为了避免在擦除时使迭代器无效后使用迭代器,循环体应该是这样的:

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