C STL迭代器失效的幾種情況

2021-10-24 01:17:39 字數 683 閱讀 9962

**大神部落格

陣列型資料結構:

該資料結構的元素是分配在連續的記憶體中,insert和erase操作,都會使得插入點和刪除點之後的元素變動位置,所以,插入點和刪除掉之後的迭代器全部失效,也就是說insert(*iter)和erase(*iter)之後進行iter++是錯誤的。

解決方法

erase(*iter)的返回值是下乙個有效迭代器的值

iter =cont.erase(iter);

鏈表型資料結構:

對於list型的資料結構,使用了不連續分配的記憶體,刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器。

解決辦法

erase(*iter)會返回下乙個有效迭代器的值

erase(iter++)

樹形資料結構:

使用紅黑樹來儲存資料,插入不會使得任何迭代器失效;刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器。

解決辦法

erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要採用erase(iter++)的方式刪除迭代器。

關於迭代器失效的幾種情況

一 序列式容器迭代器失效 1 順序容器 2 對於序列式容器vector deque 當當前元素iterator刪除後 就是刪除乙個元素後 從起始位置到當前刪除位置的迭代器是正常的,其後的所有元素的迭代器都會失效,這是因為vector deque都是連續的儲存一段空間,所以當對其進行erase操作時,...

C STL 迭代器失效

2 刪除 當進行刪除操作 erase,pop back 後,指向刪除點的迭代器全部失效 指向刪除點後面的元素的迭代器也將全部失效。刪除點之前的迭代器仍有效。二 deque迭代器的失效情況 1 插入 1 在deque容器首部或者尾部插入元素不會使得任何迭代器失效。但是指向存在的元素的引用和指標不會失效...

C STL迭代器失效

迭代器失效就是說,對容器進行了一些操作後,先前的迭代器無法進行解引用操作去訪問容器的元素。迭代器失效可能會造成程式崩潰,如下圖 如果插入元素導致vector達到最大容量,那麼會重新分配記憶體並將老的元素拷貝到新的記憶體中。元素的位址都改變了,顯然迭代器和引用都將失效 如果插入元素沒有引起重新分配記憶...