vector中元素的删除


如果想要删除vector中值为val的元素,最容易想到的方法就是对vector进行遍历,然后遇到值为val时就将其删除。比较好的是vector容器有erase操作。
但是这儿需要注意,与list中的erase不同,list的erase操作之后,之前获得的迭代器还是有效的,而在vector中因为vector是顺序存储,所以,一旦删除一个元素,之前获得的迭代器就会失效了,vector.begin()和vector.end()是变化的。注意到,erase的返回值是一个迭代器,而这个迭代器就是指向删除之前元素后的第一个元素。注意到这一点我们可以采用下面的方法实现:
void remove_v(vector< int>& v, int val){
    vector< int>::iterator ite;
     for(ite=v.begin();ite!=v.end();){
         if(*ite==val)
            ite=v.erase(ite);
         else
            ++ite;
    }
}

或者用while循环
void remove_v(vector< int>& v, int val){
    vector< int>::iterator ite=v.begin();
     while(ite!=v.end()){
         if(*ite==val)
            ite=v.erase(ite);
         else
            ++ite;
    }
}
其实还可以采用另一种方法,在STL的算法中有一个函数remove,这个函数可以将迭代器范围内的等于某个值的元素“删除“(这里的删除是不改变容器的大小,只是将一些不满足条件的元素前移,这样的话保留的元素都移到了容器的前面,而remove正好就指向这些保留元素后的第一个元素,而后面的就是要删除的。)然后执行erase操作就可以了。
void remove_v2(vector< int>& v, int val){
    v.erase(remove(v.begin(),v.end(),val),v.end());
}
完整程序如下:
#include <iostream>
#include <fstream>
int main( int argc, char* argv[]){
     using  namespace std;
    fstream  in, out;
     if(argc> 1in.open(argv[ 1],ios:: in|ios::binary);
     if(argc> 2out.open(argv[ 2],ios:: out|ios::binary);
    ( out.is_open()? out:cout)
        <<                                                     
        ( in.is_open()? in:cin).rdbuf();

}

#endif
#if 0
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using  namespace std;
void remove_v(vector< int>& v, int val){
    vector< int>::iterator ite;
     for(ite=v.begin();ite!=v.end();){
         if(*ite==val)
            ite=v.erase(ite);
         else
            ++ite;
    }

}
void remove_v2(vector< int>& v, int val){
    v.erase(remove(v.begin(),v.end(),val),v.end());
}
int main(){
     int a[]={ 1, 2, 3, 1, 2, 3, 1, 2, 3, 3, 3, 0, 3, 8};
     int len= sizeof(a)/ sizeof(a[ 0]);
    vector< int> v(a,a+len);
    copy(v.begin(),v.end(),ostream_iterator< int>(cout, "   "));
    cout<<endl;
     int val= 3;
    remove_v2(v,val);
    copy(v.begin(),v.end(),ostream_iterator< int>(cout, "   "));
    cout<<endl;
}

 

参考:
http://www.cppblog.com/guaguaman/archive/2010/11/10/133240.html
http://blog.csdn.net/metasearch/article/details/2386939/


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM