在stl中,對於容器vector,deque,如果執行了插入或者刪除操作之後,之前的迭代器都失效了。
用例子來說明情況。
我們先構造乙個vector:
vector
v;int i = 0;
for (i=1;i<6;i++)
for (i=5;i>0;i--)
cout
<
for (i=0;icout
}cout
<
這時要求刪除vector中的元素值為4的那兩個元素
//定義乙個迭代器,指向值為4的元素
vector
::iterator iter = v.begin() + 3;
cout
<
<
for (i = 0;iif (*iter == v[i])
}
當i=3時,遇到了第乙個值為4的元素,此時呼叫了erase函式來刪除此元素,正常執行;i=4時,執行*iter == v[i]時,就會報錯,錯誤說明就是:vector iterator not dereferencable,這表明之前定義的iter迭代器失效了,再使用iter就會遇到這個問題,原因就是erase刪除元素後,導致的iter迭代器失效。
所以當迭代器失效後,就要重新給迭代器賦值。
例如,修改之前**中的內容:
//定義乙個迭代器,指向值為4的元素
vector
::iterator iter = v.begin() + 3;
cout
<
<
for (i = 0;iif (*iter == v[i])}}
這裡我們以下語句實現通過重新查詢vector內是否還有值為4的元素,如果有就返回指向此元素的迭代器,如果沒有就返回end(),重新給iter賦新的迭代器
iter = find(v.begin(),v.end(),n);
最後在輸出vector內容:
cout
<
for (i=0;icout
}cout
<
如預期一樣刪掉了vector中的值為4的元素,而且也沒有迭代器失效的問題。
總結:在使用迭代器時,要特別注意當刪除或者插入操作之後,迭代器的有效性問題,stl中沒有對於迭代器有效性的檢查功能。
有效性單元
demonstration company公司生產乙個叫做pcx conveyor的產品,portable model pcx conveyor.標準的產品bom如下 物料數量 發料倉庫 10pcx belt black trackmate 533 cos pvc 1.0000 whams1 20p...
郵箱有效性驗證
由於面對全球性客戶,主要是用郵箱來做為聯絡的主要工具所以,應用 軟體來做集中 程式有時有問題主要原因總結為郵箱不合法造成的 提前對不合法的郵箱進行一定的標記是很不必要的 以前的處理方法對郵箱進行正則驗證,但沒找到比較好的規則.後來想到了利用微軟提供的乙個 mailaddress 物件來對其email...
有效性設定解疑
難度等級1 在實際應用,我們會遇到資料校驗的問題。其中一類是將本表單的兩個資料做校驗。如下圖 如公司規定,預收款金額的合計值 必須大於等於 合同金額的三分之一!由於有效性設定介面的含義有些模糊,很多使用者看到型別的需求都使用公式來做 其實只要在合計資料項上按下圖所示設定有效性即可 現在問題來了,允許...