1. 程式人生 > >stl叠代器失效

stl叠代器失效

需要 以及 一個 cap iter 執行 -h serve 什麽

叠代器(iterator)是一個可以對其執行類似指針的操作(如:解除引用(operator*())和遞增(operator++()))的對象,我們可以將它理解成為一個指針。但它又不是我們所謂普通的指針,我們可以稱之為廣義指針,你可以通過sizeof(vector::iterator)來查看,所占內存並不是4個字節。
首先對於vector而言,添加和刪除操作可能使容器的部分或者全部叠代器失效。那為什麽叠代器會失效呢?vector元素在內存中是順序存儲,試想:如果當前容器中已經存在了10個元素,現在又要添加一個元素到容器中,但是內存中緊跟在這10個元素後面沒有一個空閑空間,而vector的元素必須順序存儲一邊索引訪問,所以我們不能在內存中隨便找個地方存儲這個元素。於是vector必須重新分配存儲空間,用來存放原來的元素以及新添加的元素:存放在舊存儲空間的元素被復制到新的存儲空間裏,接著插入新的元素,最後撤銷舊的存儲空間。這種情況發生,一定會導致vector容器的所有叠代器都失效。


我們看到實現上述所說的分配和撤銷內存空間的方式以實現vector的自增長性,效率是極其低下的。為了使vector容器實現快速的內存分配,實際分配的容器會比當前所需的空間多一些,vector容器預留了這些額外的存儲區,用來存放新添加的元素,而不需要每次都重新分配新的存儲空間。你可以從vector裏實現capacity和reserve成員可以看出這種機制。
capacity和size的區別:size是容器當前擁有的元素個數,而capacity則指容器在必須分配新存儲空間之前可以存儲的元素總數。
vector叠代器的幾種失效的情況:
1、當插入(push_back)一個元素後,end操作返回的叠代器肯定失效。

2、當插入(push_back)一個元素後,capacity返回值與沒有插入元素之前相比有改變,則需要重新加載整個容器,此時first和end操作返回的叠代器都會失效。
3、當進行刪除操作(erase,pop_back)後,指向刪除點的叠代器全部失效;指向刪除點後面的元素的叠代器也將全部失效。
deque叠代器的失效情況: 在C++Primer一書中是這樣限定的:
1、在deque容器首部或者尾部插入元素不會使得任何叠代器失效。
2、在其首部或尾部刪除元素則只會使指向被刪除元素的叠代器失效。
3、在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有叠代器失效。但是:我在vs2005測試發現第一條都不滿足,不知為何?等以後深入STL以後慢慢的領會吧!

只有list的叠代器好像很少情況下會失效。也許就只是在刪除的時候,指向被刪除節點的叠代器會失效吧,其他的還沒有發現。
先看兩條規制:
1、對於節點式容器(map, list, set)元素的刪除,插入操作會導致指向該元素的叠代器失效,其他元素叠代器不受影響。
2、對於順序式容器(vector)元素的刪除、插入操作會導致指向該元素以及後面的元素的叠代器失效。
眾所周之當使用一個容器的insert或者erase函數通過叠代器插入或刪除元素"可能"會導致叠代器失效,因此很多建議都是讓我們獲取insert或者erase返回的叠代器,以便用重新獲取新的有效的叠代器進行正確的操作:
代碼如下:

iter = vec.insert(iter);

iter = vec.erase(iter);

原文地址:http://blog.csdn.net/hackbuteer1/article/details/7734382

stl叠代器失效