Contents ...
udn網路城邦
C++容器中的erase函數使用舉例
2015/09/24 14:27
瀏覽125
迴響0
推薦0
引用0
C++中容器的使用可謂非常廣泛,可是使用不當也會造成相當頭疼的麻煩。我就C++中常用的容器中常犯的一個erase函數的錯誤,給大家共享:


erase函數在容器中是不可小覷的一個函數,但是用它同樣不可小覷:容器中的叠代器是強大的工具,大家都知道erase函數調用之後容器會自動的縮小自己的長度(也就是size函數的返回值),但是縮小之後,我們就有很多隱患:

(1)叠代子會不會因為容器的長度縮小之後越界;

(2)調用erase函數之後叠代子到什麽地方去了;

(3)erase函數調用之後的返回值仍然是叠代子,這個叠代子有何用。


下面我一一作答:

case1:越界是會的,使用容器的erase函數必須要考慮這個情況,具體為什麽會這樣,請看case2;

case2:調用erase函數之後叠代子就指向了下一個容器元素的地址,這就是為什麽有可能越界,比如:

           你要擦除的元素正好是容器的最後一個元素,調用erase函數之後,那麽就華麗麗的越界了,但是這種越界,有的編譯器是看不出什麽問題的(因為一般叠代器都是配合循環使用),當程序垮掉的那一刻,我們也很難判斷到底是哪兒出的問題。

case3:erase函數返回的叠代子正就是下一個指向下一個元素的叠代子,因此經常用erase函數的返回值來重新賦值我們循環中使用的叠代子。


好了,上一個測試程序【已經編譯運行完畢,大家可以放心】:



#include <iostream>

#include <vector>

using namespace std;


//declare constrait variable as the function returned value

const int IS_ERR = 0;

const int IS_OK = 1;


//create a test vector

template<typename T>

int CreateTestVector(vector<T> &vec,const int iLength,const T initValue)

{

    vec.clear(); //clear vector

    for (int i = 0; i < iLength; ++i)

    {

        vec.push_back(initValue+i);

    }


    //judge the test vector is create successfully or not

    if (iLength != vec.size() || initValue != vec.at(0))

    {

        return IS_ERR;

    }


    return IS_OK;

}


//display the elements of vector

template<typename T>

void DisplayElements(const vector<T> vec)

{

    for (int i = 0; i < vec.size(); ++i)

    {

        cout << vec.at(i) <<" ";

    }

    cout << endl;

}


//test main function

int main()

{

    vector<int> iVec;

    if (IS_OK != CreateTestVector(iVec,10,11))

    {

        return -1;

    }


    //erase test number

    int testNum = iVec.at(3);


    cout << "before erase:";

    DisplayElements(iVec);


    vector<int>::iterator itr = iVec.begin();

    while (itr != iVec.end())

    {

        if (testNum == (*itr))

        {

            cout << "erase element: " << *itr << endl;

            itr = iVec.erase(itr); //assign new itr to old itr

        }

        else

        {

            ++itr;

        }

    }


    cout << "after erase:";

    DisplayElements(iVec);


    return 0;

}

限會員,要發表迴響,請先登入