erase()的使用

通常,remove()和erase()联合使用:remove的返回值作为erase()的第一个参数。

vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(5);
veci.push_back(3);
veci.push_back(2);
veci.push_back(3);
veci.erase(remove(vec.begin(), vec.end(), 3),vec.end());  //这样把veci中的3删除
//cout<<veci.size(); 输出5


erase(): 删除指定位置的元素后,返回值是一个迭代器,指向删除元素下一个元素!

有两种形式:
删除指定位置的元素:erase(iterator position);
删除某一段的元素:erase(iterator first, iterator last);


法1:

for(vector<int>::iterator iter=veci.begin();iter!=veci.end(); iter++)
{
      if( *iter == 3)
            veci.erase(iter);//veci.erase(it)之后,iter变成一个野指针,不能进行++。
}                           


修改:

for(vector<int>::iterator iter=veci.begin();iter!=veci.end();)
{
      if( *iter == 3)
      {
  iter0=iter;
           veci.erase(iter0);
           //cout<<*iter; 输出4        //在执行完删除后,iter此时指向下一个元素
      }
 iter++;
}

这段代码也是错误的:
1)无法删除两个连续的"3"; (iter0在erase()之后失效)
2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

为了能够删除连续的3,使用remove函数:STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。

如:
vector<int> vec = {1,1,2,3,4,5,6,7,8,9}
remove(vec.begin(), vec.end(), 1);

结果如下
vec = {2,3,4,5,6,7,8,9,1,1};

修改:
vec.erase(remove(vec.begin(), vec.end(), 1),vec.end());  

结果:       

vec.erase(remove(vec.begin(), vec.end(), 1),vec.end());  
                                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值