erase()的使用

来源:互联网 发布:领啦试用网站源码 编辑:程序博客网 时间:2024/06/03 21:59

通常,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());  

                                    
原创粉丝点击