STL vector的之erase应用iterator

来源:互联网 发布:oa软件开发平台 编辑:程序博客网 时间:2024/05/23 23:17

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

void main() 
{ 
    vectormember; 
   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++; 
   } 
}

原创粉丝点击