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

【C++】关于map的遍历 删除的更多相关文章

  1. map/vector遍历删除

    map遍历删除 map<int, vector<int>>::iterator it = g_map.begin(); for (; it != g_map.end(); /* ...

  2. stl map高效遍历删除的方法 [转]

    for(:iter!=mapStudent.end():) {      if((iter->second)>=aa)      {          //满足删除条件,删除当前结点,并指 ...

  3. stl map高效遍历删除的方法

    for(:iter!=mapStudent.end():) {      if((iter->second)>=aa)      {          //满足删除条件,删除当前结点,并指 ...

  4. map循环遍历删除

    typedef map<string,int> MapFileList; int main() { MapFileList m_SingleList; m_SingleList.inser ...

  5. 集合--(List、Set、Map)遍历、删除、比较元素时的小陷阱

    6,Map集合遍历的4中方法? 5,List遍历时如何remove元素 4.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下标方式遍历集合,在遍历过程中删除元素,你可能会 ...

  6. STL容器的遍历删除

    STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...

  7. 对JAVA集合进行遍历删除时务必要用迭代器

    java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...

  8. STL中用erase()方法遍历删除元素 .xml

    pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...

  9. map的正确删除方式

    遍历删除map元素的正确方式是 for(itor = maptemplate.begin; itor != maptemplate.end(); ) {      if(neederase)     ...

随机推荐

  1. rdf(资源描述框架)

    资源描述框架(Resource Description Framework),一种用于描述Web资源的标记语言.RDF是一个处理元数据的XML(标准通用标记语言的子集)应用,所谓元数据,就是“描述数据 ...

  2. docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客

    原文:docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客 端口映射,data目录映射,配置文件映射(在当前目录下进行启动). docker run ...

  3. 通过游戏学python 3.6 第一季 第一章 实例项目 猜数字游戏--核心代码 可复制直接使用 娱乐 可封装 函数

    本文实例讲述了python实现的简单猜数字游戏.分享给大家供大家参考.具体如下: 给定一个1-99之间的数,让用户猜数字,当用户猜错时会提示用户猜的数字是过大还是过小,知道用户猜对数字为止,猜对数字用 ...

  4. View的滑动冲突和解决方案

    1.滑动冲突原因: 当有内外两层View同时可以滑动的时候,这个时候就会产生滑动冲突. 2.常见的冲突场景: 场景1: 场景2: 场景3: 4.解决方法种类: (1)外部拦截法: 针对场景1,我们可以 ...

  5. BaiduTemplate [ 百度模板引擎 ]

    地址: http://baidufe.github.io/BaiduTemplate/

  6. socket.io的基本使用

    服务端: 1.监听客户端连接: io.on("connection",socket=>{ }); 不分组数据传输:传输对象为当前socket 2.1给该socket所有客户端 ...

  7. 使用Workstation虚拟机部署Linux操作系统

    一.安装虚拟机: 1.安装VMware Workstation; 2.选择主页.点创建新的虚拟机: 3.选择“典型”然后点下一步: 4.选择稍后安装操作系统: 5.客户机从左系统选择“Linux”版本 ...

  8. 内核、中断和网络 $ sysctl -a | grep ...$ cat /proc/interrupts$ cat /proc/net/ip_conntrack /* may take some time on busy servers */$ netstat$ ss -s

    你的中断请求是否是均衡地分配给CPU处理,还是会有某个CPU的核因为大量的网络中断请求或者RAID请求而过载了? SWAP交换的设置是什么?对于工作站来说swappinness 设为 60 就很好, ...

  9. wordpress主题之后台菜单编辑,小工具

    1一:菜单编辑 在functions.php 文件加入 if (function_exists('register_nav_menus')) { register_nav_menus(array( / ...

  10. CURL POST PHP

    function SendPostCurl($url,$post_data){ $curl = curl_init(); //初始化 curl_setopt($curl, CURLOPT_URL, $ ...