Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1754195
  • 博文数量: 198
  • 博客积分: 4088
  • 博客等级: 上校
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 16:29
个人简介

游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c

文章分类

全部博文(198)

文章存档

2017年(1)

2016年(12)

2015年(1)

2014年(3)

2013年(13)

2012年(18)

2011年(150)

分类: C/C++

2012-09-06 10:28:29

 在c++编程的时候,我们有时会遇到,在遍历map的时候,删除符合某个条件的元素,如果我们不做任何处理,直接删除map元素的话,程序会异常终端,提示"Expression: map/set iterator not incrementable"。所以如果想在遍历map的时候删除元素,必须做一些处理,下面给出一种方法.

  1. #include <iostream>
  2. #include <map>
  3. using namespace std;


  4. int main()
  5. {
  6.     map<int, int> test_map;
  7.     test_map[1] = 1;
  8.     test_map[2] = 2;
  9.     test_map[3] = 3;
  10.     test_map[4] = 4;
  11.     
  12.     for( std::map<int, int>::iterator iter = test_map.begin();
  13.         iter != test_map.end(); ++ iter )
  14.     {
  15.         cout << iter->first << " " << iter->second << endl;
  16.     }
  17.     
  18.     int count = 0;
  19.     
  20.     // delete the element
  21.     for( std::map<int, int>::iterator iter = test_map.begin();
  22.         iter != test_map.end(); )
  23.     {
  24.         std::map<int, int>::iterator it_back = iter;
  25.         bool is_first_element = false;
  26.         if(it_back != test_map.begin())
  27.         it_back --;
  28.         else
  29.         is_first_element = true;
  30.         
  31.         // delete the element that matches the specific condition
  32.         if( iter->first % 2 == 0)
  33.         {
  34.             test_map.erase(iter);
  35.             
  36.             if(is_first_element)
  37.              iter = test_map.begin();
  38.             else
  39.                 iter = ++ it_back;
  40.         }else iter ++;     
  41.         
  42.         count ++;
  43.     }
  44.     
  45.     cout << "use count:" << count << endl;
  46.     
  47.     cout << "after delete " << endl;
  48.     
  49.     for( std::map<int, int>::iterator iter = test_map.begin();
  50.         iter != test_map.end(); ++ iter)
  51.     {
  52.         cout << iter->first << " " << iter->second << endl;
  53.     }
  54.     
  55.     system("pause");
  56.     return 0;
  57.     
  58. }
运行结果

  1. 1 1
  2. 2 2
  3. 3 3
  4. 4 4
  5. use count:4
  6. after delete
  7. 1 1
  8. 3 3
遍历所需次数,也就是整个map的总元素个数,不会增加额外的次数

********************************************************************
2017.07.01 飘过
其实遍历map时候,删除元素很常见,也很简单

  1. for( std::map<int, int>::iterator iter = test_map.begin(); iter != test_map.end(); ){
  2.      if( iter->first % 2 == 0){
  3.          iter = test_map.erase(iter);
  4.      }else iter++;
  5.   }

或者

  1. for( std::map<int, int>::iterator iter = test_map.begin(); iter != test_map.end(); ){
  2.      if( iter->first % 2 == 0){
  3.          test_map.erase(iter ++);
  4.      }else iter++;
  5.   }

阅读(26215) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~