使用STL庫時需要注意的事項 迭代器失效

2021-09-13 01:55:59 字數 1236 閱讀 3878

當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素"可能"會導致迭代器失效,因此我們為了避免危險,應該獲取insert或者erase返回的迭代器,以便用重新獲取的新的有效的迭代器進行正確的操作 

iter=vec.insert(iter);

iter=vec.erase(iter);

迭代器失效的型別:

1.由於插入元素,使得容器元素整體「遷移」導致存放原容器元素的空間不再有效,從而使得指向原空間的迭代器失效。

2.由於刪除元素使得某些元素次序發生變化使得原本指向某元素的迭代器不再指向希望指向的元素。

vector

1、當插入(push_back)乙個元素後,end操作返回的迭代器肯定失效。

3、當進行刪除操作(erase,pop_back)後,指向刪除點的迭代器全部失效;指向刪除點後面的元素的迭代器也將全部失效。

測試:#include

#include

using namespace std;

int main()

}for(itor=st.begin();itor!=st.end();itor++)

cout<<*itor<<" ";

system("pause");

return 0;

}如果不獲取erase返回的迭代器,迭代器失效,執行出現錯誤

list

1、插入操作(insert)和接合操作(splice)不會造成原有的list迭代器失效,這在vector中是不成立的,因為vector的插入操作可能造成記憶體重新配置,導致所有的迭代器全部失效。

2、list的刪除操作(erase)也只有指向被刪除元素的那個迭代器失效,其他迭代器不受影響。(list目前只發現這一種失效的情況)

deque  

在deque容器首部或者尾部插入元素不會使得任何迭代器失效。//通過vs2012測試不管前端插入還是後端插入,都會使迭代器 失效 

2、在其首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效。 

3、在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。

set和map

與list相同,當對它進行insert和erase操作時,操作之前的所有迭代器,在操作完成之後都依然有效,但被刪除的元素的迭代器失效。

總之, 下次說到迭代器失效(尤其涉及到容器大小的改變, 比如刪除, 插入)時, 一定要留個心眼。  在實際程式設計中, 如果稍不注意, 則可能引起非常難以捕捉的bug, 折磨你我, 何不提前防範呢?

專案發布時需要注意的事項

經過幾個月的努力,我們組的專案walle終於要上線了,也許是經驗的不足,也許是太衝動了,上線後才發現上線準備的根本就不充分。經過這次事件後,認識到以下幾點,免得下次上同樣的當。1.上線前,要對自己嚴格一點,發現的問題,可以修復一定要修復,不要報有僥倖的心理,這個問題不重要,大家不會關注,一旦上線後,...

使用特殊索引時所需要注意的事項

在oracle裡除了我們常用的b樹索引外,還有一些特殊索引能被使用。如 倒序索引,位對映索引,函式索引等。我根據自己的體會,列乙個注意事項 倒序索引 oracle doc上說倒序索引比較適合於序列號產生的字段,如唯一編號。但是這樣的索引對於範圍的比較,如 between and 等操作是不起作用的 ...

使用繼承需要注意事項

使用繼承注意兩點 第一 子類無法繼承private 修飾的屬性和方法 第二 子類無法繼承父類的構造方法 子類除了繼承父類的屬性和方法之外,還可以有自己的屬性,但是呼叫從父類繼承的方法卻不能獲取,比如 public class personneldept extends department 子類研發...