在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>1) in.open(argv[1],ios::in|ios::binary);
    if(argc>2) out.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;
}

转自:https://www.cnblogs.com/xkfz007/archive/2012/08/17/2644061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值