C++在擦除时循环通过映射
C++ loop through map while erasing
要在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++11
,erase
无论如何都会返回下一个迭代器,所以您可以使用它。)
您可能需要在擦除元素时重新分配迭代器,否则它将无效。。。
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;
}
相关文章:
- 在映射擦除c++期间执行循环的次数
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 映射中循环的迭代器
- 为什么这个 x 值在这个循环映射中没有增加?C++
- 在循环(C++)中用新指针填充映射
- c++ 在循环中删除迭代器(映射的映射)
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 映射基于自动的循环单元素访问C++
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- 在 stl 映射和列表 (c++) 上进行迭代的泛型循环
- C++:分段函数,循环初始化为映射
- c++ 过期映射条目线程与事件循环
- 我如何将输入分配给在 for 循环中设置的映射功能
- 循环访问提升mapped_region/内存映射文件
- 复制地图<双精度,元组<双精度,双精度>>映射<双精度,双精度>没有循环?
- 在使用无序多映射实现的有向图中查找循环
- 循环访问映射并删除动态分配的元素
- 不带迭代程序的哈希映射循环
- 如何在映射向量中循环访问地图