STL 迭代器失效

2021-07-15 23:33:20 字數 1221 閱讀 8509

迭代器失效:

指向不再存在的元素的迭代器。無效迭代器的使用未定義,可能會導致嚴重的執行錯誤。

眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素"可能"會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作

迭代器失效的型別了:

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

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

如下面**分析:

void printlist(listl)

++it;

} cout<

下面是鍊錶刪除時出現的異常——迭代器失效

l.erase(it)正常刪除以後,迭代器就失效了,it指向了乙個隨機值

而後++it,此時的it已經成為了野指標,此時對野指標進行自加操作,自然會引來異常

我們需要接收迭代器當前的位置,重新獲取新的有效的迭代器進行正確的操作

方法一:

void printlist(listl)

} cout<

void printlist(listl)

else

}cout<

void printvector(vectorv)

++it;

} cout<

下面是vector刪除時出現的異常——迭代器失效

v.erase(it)正常刪除以後,迭代器就失效了,it指向了乙個隨機值

而後++it,此時的it已經成為了野指標,此時對野指標進行自加操作,自然會引來異常

解決方法已經不能用上面處理list的erase刪除異常的處理方法一來操作了,

方法一種指標總是之向下乙個位置,而vector中刪除當前位置的資料是後面資料的覆蓋,

指標的偏移會越過資料,出現異常。故不能用方法一。

這裡可以使用方法二來處理

void printvector(vectorv)

++it;

} cout<

STL迭代器失效

vector 1.當插入 push back 乙個元素後,end操作返回的迭代器肯定失效。此時first和end操作返回的迭代器都會失效。3.當進行刪除操作 erase,pop back 後,指向刪除點的迭代器全部失效 指向刪除點後面的元素的迭代器也將全部失效。deque迭代器的失效情況 1.在de...

stl 迭代器失效

1 對於基於連續記憶體的容器,容器元素的增刪,有可能會導致迭代器的失效。考慮 int main int argc,char ar 2 通過memory可以記憶體的變化,刪除之前是 1 2 3 刪除之後是2 3,刪除iter1會導致迭代器iter2和ri失效。迭代器和引用,底層都是指標,刪除iter1...

STL 迭代器失效問題

最近在專案開發中,遇到乙個異常,經過測試,發現是迭代器失效問題,於是稍微總結了一下。vector迭代器失效測試 測試程式 void vectortest vector int iterator iter for iter container.begin iter container.end iter...