遍历list或map时删除元素(较巧妙)

#include <iostream>
#include <list>
#include <map>


using namespace std;


int main()
{
     std::list<int> test_list;
     test_list.push_back(1);
     test_list.push_back(2);
     test_list.push_back(3);
     test_list.push_back(4);
     test_list.push_back(5);
     test_list.push_back(6);
     
     cout << "*****************delete list***************" << endl;
     std::list<int>::iterator iter = test_list.begin();
     for(iter ; iter != test_list.end();)
     {
              if(*iter % 2 == 0)
              {
                      test_list.erase(iter++);
             }else ++iter;
    }
    
    for(iter = test_list.begin(); iter != test_list.end(); ++ iter)
    {
              cout << *iter << " ";
    }
    cout << endl;
    
    cout << "*****************delete map****************" << endl;
    std::map<int, int> test_map;
    test_map[1] = 1;
    test_map[2] = 2;
    test_map[3] = 3;
    test_map[4] = 4;
    test_map[5] = 5;
    test_map[6] = 6;
    std::map<int, int>::iterator t_iter = test_map.begin();
    for(t_iter; t_iter != test_map.end(); )
    {
                 if(t_iter->second % 2 == 0)
                 {
                                  test_map.erase(t_iter++);
                }else ++ t_iter;
    }
    
    for(t_iter = test_map.begin(); t_iter != test_map.end(); ++ t_iter)
    {
              cout << t_iter->second << " ";
    }
    cout << endl;
    
    system("pause");
    return 0;
}
比较巧妙的点就在于 test_list.erase(iter++); test_map.erase(t_iter++); 利用后置自增操作符,传给erase函数的iterator是指向当前元素,而在这条语句之后,iter 自增,从而指向下一个元素,而不会导致因当前iterator删除而不能正确访问下一个元素的问题。
 
运行结果
 
*****************delete list***************
1 3 5
*****************delete map****************
1 3 5


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值