c++ vector 刪除指定元素


  只使用vector的erase函數,記住,該函數是迭代器失效,返回下一個迭代器

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    vector<int> arr;
    arr.push_back(6);
    arr.push_back(7);
    arr.push_back(8);
    arr.push_back(9);

    for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
    {
        if(* it == 8)
        {
            it = arr.erase(it); //不能寫成arr.erase(it);
        }
        else
        {
            ++it;
        }

 

看下面的一個程序,刪除值為4和7的元素,為什么只刪除了4?

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{

    vector<int> iVec;

    vector<int>::iterator it;
    int i;

    for( i=0;i<10;i++)

        iVec.push_back(i);

    for( i=0;i<iVec.size();i++)
        cout<<iVec[i]<<ends;
    cout<<endl;

    for(it=iVec.begin();it!=iVec.end();++it)

    {

        if(*it ==4 || *it == 7)

        {

            it=iVec.erase(it);

        }

        else

            ++it;

    }

   for( i=0;i<iVec.size();i++)
        cout<<iVec[i]<<ends;
    cout<<endl;

}

沒有刪除7,為什么?

l例如上面這個 1 2 3 4 5 6 7 8 9
如果要刪除4 和7 兩個元素
則刪除4后iterator返回5,不滿足if()判斷,這時++it執行兩次,一次是else里面,一次是for()循環里面,導致7被錯過
改為:
 it=iVec.erase(it);
      --it;//這里回退一個

上面的程序基本上屬於弱智型程序,沒必要it++,使用下面的:

    for(it=iVec.begin();it!=iVec.end();++it)

    {

        if(*it ==4 || *it == 7)

        {

            it=iVec.erase(it);

        }

     

    }

 (2014-12-1修改:

上面程序經過網友指出if(*it ==4 || *it == 5)有問題,確實如此,2個相鄰的元素,在for++中被跳過了。為了處理這種情況,把for循環中的it++移動到for中。

for(it=iVec.begin();it!=iVec.end();)

{

  if(*it==4 || *it==5)

    it=iVec.erase(it);

  else

    it++;

}

這樣程序就可以處理4,5,4,7之類的了。)

 

 

不用循環結合remove使用:

1、remove並不是刪除,僅僅是移除,要加上erase才能完成刪除。 
2、remove並不是刪除指定位置的元素,而移除所有指定的元素。 
3、用algorithm代替成員函數不是一個好的選擇。

remove只是簡單地用"未刪除"對象來填補被刪除對象留下的缺口,每一個刪除對象在尾部還是會留下一個相應的"死亡"對象. 
可以這樣來使用remove... 
vector<int>vec; 
vec.erase(remove(vec.begin(),vec.end(),value),vec.end()); //value是要刪除的值

 

    
vector<int> v;
     
    int i;
    for( i=0;i<10;i++)

        v.push_back(i);

remove(v.begin(),v.end(),5);
    remove(v.begin(),v.end(),6);
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)
    {
         
        cout<<*it<<ends;
    }

輸出:

0123478999

參考下一篇remove

http://www.cnblogs.com/youxin/archive/2012/06/22/2558394.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM