1. int main(int argc, char* argv[])
  2. {
  3. map<string, string> mapData;
  4. mapData["a"] = "aaa";
  5. mapData["b"] = "bbb";
  6. mapData["c"] = "ccc";
  7. for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); i++)
  8. {
  9. if (i->first == "b")
  10. {
  11. mapData.erase(i);
  12. }
  13. }
  14. return 0;
  15. }

错误:
    i指针在元素被删除后失效了,回到for语句中与mapData.end() 进行比较错误,这个一般都了解。
下面这个是正确删除方法:

  1. int main(int argc, char* argv[])
  2. {
  3. map<string, string> mapData;
  4. mapData["a"] = "aaa";
  5. mapData["b"] = "bbb";
  6. mapData["c"] = "ccc";
  7. for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
  8. {
  9. if (i->first == "b")
  10. {
  11. mapData.erase(i++);
  12. }
  13. else
  14. {
  15. i++;
  16. }
  17. }
  18. return 0;
  19. }

这里贴出一个新的错误:

  1. int main(int argc, char* argv[])
  2. {
  3. map<string, string> mapData;
  4. mapData["a"] = "aaa";
  5. mapData["b"] = "bbb";
  6. mapData["c"] = "ccc";
  7. for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
  8. {
  9. if (i->first == "b")
  10. {
  11. mapData.erase(i/*++*/);
  12. }
  13. else
  14. {
  15. /*i++*/;
  16. }
  17. i++;
  18. }
  19. return 0;
  20. }

这同样是另外一个错误。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);

最新文章

  1. ExtPB.Net:窗体应用技巧(2)在树形导航下打开弹出的win窗口
  2. 【原】mysql5.6 split函数_字符串的分割
  3. SQL Server中CROSS APPLY和OUTER APPLY的应用详解
  4. 1Z0-053 争议题目解析690
  5. 浅谈Java中的对象和引用
  6. spring MVC、mybatis配置读写分离
  7. angularJs的ng-class切换class
  8. 关于在mac 配置eclipse c开发
  9. Todd&#39;s Matlab讲义第1讲:向量,函数和作图
  10. LA 2678 Subsequence
  11. 【BZOJ】【1385】【Baltic2000】Division expression
  12. 《C++反汇编与逆向分析技术揭秘》——函数的工作原理
  13. 导航原理实验系统软件——node-webkit初探
  14. 16.3Sum Closet
  15. Unicode、UTF-8 和 ISO8859-1到底有什么区别
  16. golang与vscode的安装与配置
  17. photoshop实现倾斜图片的修正
  18. php之变量和常量
  19. 第7章 网络层协议(3)_ARP协议
  20. 使用wget命令爬取整站

热门文章

  1. Dockerfile镜像制作时间同步
  2. Tensorflow技巧
  3. Java中gson的使用
  4. javascript基础:语法与html结合方式
  5. AC自动机(模板) LUOGU P3808
  6. H5C3--文本阴影text-shadow
  7. C# 基础才是重中之重~对象的生与死
  8. java并发系列(一)-----多线程简介、创建以及生命周期
  9. ztree树节点重叠问题
  10. 用CSS添加选中文字的背景色