zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    CF1480C Searching Local Minimum
    如何根据IP地址查到主机名
    转贴:关于内部重定向(forward)和外部重定向(redirect)
    读懂vmstat
    Javascript在网页页面加载时的执行顺序
    安全测试学习笔记一
    Linux文件查找命令find,xargs详述
    mvn常用命令
    prototype.js 让你更深入的了解javascript的面向对象特性
    【转】Velocity研究学习文档
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2644061.html
Copyright © 2011-2022 走看看