C++ STL遍历map的时候如何删除其中的element
2015-08-08 16:14
393 查看
我们通过map的erase(iterator it)方法删除元素的时候,如果此时erase处于遍历map的代码中,那么调用erase就需要小心一些。因为erase会导致输入参数iterator变的无效,从而影响后续的it++遍历map的逻辑。
简单做法是,先将要删除的it保存下来,然后将用于遍历map的it指向下一个位置,然后删除掉保存下来的it。如下面代码所示:
需要注意的是,这里windows的STL(windows C++编译器带的STL)和linux上的STL(gcc的STL)实现不同。
windows的STL中,map的erase方法会返回一个iterator,这个iterator指向的是当前被删除的iterator后面的iterator,所以这样的话,只需要将用于循环的iterator赋成erase函数的返回值就可以了。参考上面代码,就是这样:
mapit = map1.erase(mapit);然后continue就可以。
但是Linux下这样写代码是无法通过编译的
简单做法是,先将要删除的it保存下来,然后将用于遍历map的it指向下一个位置,然后删除掉保存下来的it。如下面代码所示:
#include <map> #include <iostream> using namespace std; int main() { map<int, int> map1; map<int, int>::iterator mapit; map<int, int>::iterator saveit; map1[1] = 2; map1[2] = 3; map1[3] = 4; map1[4] = 5; mapit = map1.begin(); while (mapit != map1.end()) { cout << "Element key: " << mapit->first << ", value: " << mapit->second << endl; if (mapit->first == 2) { saveit = mapit; mapit++; map1.erase(saveit); continue; } mapit++; } cout << "Map size: " << map1.size() << endl; return 0; }
需要注意的是,这里windows的STL(windows C++编译器带的STL)和linux上的STL(gcc的STL)实现不同。
windows的STL中,map的erase方法会返回一个iterator,这个iterator指向的是当前被删除的iterator后面的iterator,所以这样的话,只需要将用于循环的iterator赋成erase函数的返回值就可以了。参考上面代码,就是这样:
mapit = map1.erase(mapit);然后continue就可以。
但是Linux下这样写代码是无法通过编译的
相关文章推荐
- #转 c语言中.h文件的作用
- #转 c语言中.h文件的作用
- C语言中的类型提升——基础概念,但还有很多人搞不清
- C语言5种程序语句(2)——函数语句
- C++_友元函数
- C++内存对象大会战
- 【C语言】把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。
- 剑指offer刷题之c++实现的树的子结构
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- 【C语言】冒泡排序与回文判断
- 【C语言】在终端输入多行信息,找出包含“ould”的行,并打印改行。
- C++使用CInternetSession请求url下载jason数据,并且进行解析。以及注意事项
- 【C语言】学生成绩链表的录入
- 指针函数与函数指针的区别
- C语言结构体学习系列之(二)
- c语言time.h函数库小结
- 【C语言】杨氏矩阵C语言实现
- C++ 类的静态成员详细讲解
- 【C语言】在字符串中找出第一个只出现一次的字符。 如输入“abaccdeff”,则输出'b'。
- c语言解析xml文档