C++STL迭代器失效總結
看了很多中英文的相關介紹,發(fā)現(xiàn)迭代器失效這一章很多講得都不夠清晰,這里重新梳理一下,希望能對大家有所幫助。
目標讀者:最好了解容器底層原理,至少會調用各容器的接口
這里我選擇按照容器分類:
vector
reserve: 如果參數(shù)大于原容量,所有迭代器,引用,指針失效,如果小于則不會有任何影響。
插入型函數(shù)(包括但不限于insert):
分兩種情況
如果引起內存重新分配,則所有迭代器,引用,指針失效
如果沒有引起內存重新分配,則插入位置之前的所有迭代器,引用,指針不變,之后的所有迭代器,引用,指針失效。
刪除型函數(shù)(包括但不限于erase,但是不包括clear):同2
clear: 所有迭代器,引用,指針失效。
list
clear: 所有迭代器,引用,指針失效。
其余更易型操作: 僅操作的對象的迭代器,引用,指針失效。
forward_list
clear: 所有迭代器,引用,指針失效。
其余刪除型操作:僅操作的對象的迭代器,引用,指針失效。
deque
deque比較特別,因此用了斜體
clear: 所有迭代器,引用,指針失效。
插入型函數(shù)(包括但不限于insert):
分兩種情況
如果插入在deque的開頭或結尾,所有迭代器和指針失效,而引用不受影響。
如果插入在deque的中間,則所有迭代器,指針和引用都失效。
刪除型函數(shù)(包括但不限于erase,但是不包括clear):
分3種情況
如果刪除了末尾元素,則被刪除元素的迭代器,指針和引用都失效,并且尾后(past-the-end)迭代器失效。
如果刪除了首元素,則僅被刪除元素的迭代器,指針和應用都失效,但尾后迭代器不受影響。
如果僅刪除了首尾元素之外的元素,則僅被刪除元素的迭代器,指針和引用失效,但尾后迭代器不受影響。
關聯(lián)容器(有序)
clear及其它刪除型操作都僅使被刪除元素的迭代器,指針和引用失效。
無需關聯(lián)容器
分三種情況
clear及其它刪除型操作都僅使被刪除元素的迭代器,指針和引用失效。
插入型函數(shù)(包括但不限于insert): 首先不會改變指針和引用。只有當“優(yōu)先于操作元素的元素數(shù)量+插入的操作元素的元素數(shù)量<桶的數(shù)量*裝填因子”時才會使迭代器失效
rehash, reserve: 僅使所有迭代器失效,但不改變指針和引用。
valarray
resize: 使所有迭代器,指針和引用失效。