C++容器中的erase函數使用舉例
2015/09/24 14:27
瀏覽126
迴響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;
}
限會員,要發表迴響,請先登入


