STL vector的之erase应用iterator

可能有不少人用Vector时,没太注意其iterator的用法,当Vector中的元素个数改变时,会引起iterator的一些error,看看下面代码,体会一下,会令你豁然开朗的

void main() 
{ 
    vector member; 
    member.push_back(1); 
    member.push_back(2); 
    member.push_back(2); 
    member.push_back(3); 
    member.push_back(1); 
    member.push_back(2); 
    member.push_back(4); 

    vector::iterator iter;

    for(iter = member.begin(); iter != member.end(); iter++) 
                 cout<<*iter<<endl;

    cout<<"do erase--------"<<endl;

 

    for(iter = member.begin(); iter != member.end();iter++)

    { 
        if(*iter == 2) 
        { 
            member.erase(iter); 
       
   
    for(iter = member.begin();iter != member.end();iter++)

               cout<<*iter<<endl; 
}

咋一看,这不是和上面提到的第一种方法一样吗?貌似没有问题啊。可是,要注意到,调用erase后,回到for循环又继续使用迭代器,并执行++运算。
好,让我们再温习一下erase函数的说明:

iterator erase ( iterator position );

iterator erase ( iterator first, iterator last );

现在我们只关注函数执行后的副作用和返回值。函数调用后使指向position和first之后的所有迭代器失效。返回值则是一个指向删除的最后一个元素后面的元素的迭代器。所以上面代码中的iter在调用erase后就无效了,我在VS2005中测试了,确实崩溃在++的操作上。

要解决这个问题,我们只需弃用原来的迭代器,使用返回值即可,代码如下:

//iter++;放在for循环外面

for(iter = member.begin(); iter != member.end();)

{ 
    if(*iter == 2) 
    { 
        iter = member.erase(iter); 
   
    else 
    { 
        iter++; 
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值