遍历删除map中的元素之注意事项
来源:互联网 发布:yum 命令 编辑:程序博客网 时间:2024/04/25 14:21
int main(int argc, char* argv[]){ map<string, string> mapData; mapData["a"] = "aaa"; mapData["b"] = "bbb"; mapData["c"] = "ccc"; for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); i++) { if (i->first == "b") { mapData.erase(i); } } return 0;}错误: i指针在元素被删除后失效了,回到for语句中与mapData.end() 进行比较错误,这个一般都了解。
下面这个是正确删除方法:
int main(int argc, char* argv[]){ map<string, string> mapData; mapData["a"] = "aaa"; mapData["b"] = "bbb"; mapData["c"] = "ccc"; for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/) { if (i->first == "b") { mapData.erase(i++); } else { i++; } } return 0;}这里贴出一个新的错误:
int main(int argc, char* argv[]){ map<string, string> mapData; mapData["a"] = "aaa"; mapData["b"] = "bbb"; mapData["c"] = "ccc"; for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/) { if (i->first == "b") { mapData.erase(i/*++*/); } else { /*i++*/; } i++; } return 0;}
这同样是另外一个错误。i++操作主要做三件事情:1、首先把i备份一下。
2、把i加上1。
2、返回第一步备份的i。
mapData.erase(i++);
在执行erase之前,i已经被加1了。erase会使得以前那个未被加一的i失效,而加了一之后的新的i是有效的。
mapData.erase(i); // erase以后 i已经失效,不能再用i++;
i++;
那么erase操作直接让i失效,对失效的i进行加一操作也是失效的。
mapData.erase(i++);
这段代码的真正等效代码是
map<string, string>::iterator iterTemp = i;
++i;
mapData.erase(iterTemp);
转自:http://blog.csdn.net/windren06/article/details/8141921
- 遍历删除map中的元素之注意事项
- 正确遍历删除Map中的元素
- 动态删除arraylist中的元素以及遍历Map
- Map遍历与删除元素
- 删除map中的元素
- java遍历Map中的元素
- java遍历Map中的元素
- STL中list,遍历删除元素注意事项
- 遍历删除List中的元素
- 遍历删除List中的元素
- 遍历删除ArrayList中的元素
- 遍历删除ArrayList中的元素
- std::map遍历删除某些元素问题
- 遍历删除map中元素的方法
- java 遍历map时删除元素
- c++ 遍历map的时候删除元素
- java遍历Map时remove删除元素
- C++遍历中删除std::map元素
- linux 命令操作 历史管理
- CEO、CFO、COO
- zygote 孵化器孵化
- MYSQL参数“innodb_fast_shutdown”的内幕
- ACM blog
- 遍历删除map中的元素之注意事项
- 硬盘加密
- 我对linux理解之alsa二
- RabbitMQ消息过期时间
- C语言
- C#网页导出<tabel>任意tabel嵌套,多个tabel
- 【涨函数】std::find,std::find_if对类进行查找
- HBase,想说爱你不容易啊!
- 图像特征特点及其常用的特征提取与匹配方法