轉載:http://blog.csdn.net/olanmomo/article/details/38420907
轉載:http://blog.csdn.net/stpeace/article/details/46507451
轉載:http://www.cnblogs.com/xkfz007/articles/2509433.html
轉載:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/13/2636375.html
有這樣一個應用場景,用vector容器儲存資料,一邊遍歷一邊刪除資料,同時在遍歷刪除的過程中又進行push_back()操作,因為用的是迭代器進行遍歷,程式執行過程中出現這個錯誤
此錯誤說明訪問了失效的vector迭代器。
經查詢發現:vector在遍歷的途中,別的位置push_back()一個元素,這時迭代器就失效了,才導致錯誤出現。
注:所以在使用vector遍歷刪除過程中不能再其他地方進行push_back()操作。
正確的做法是這樣的:
STL裡所有的容器類的erase實現都會返回一個iterator,這個iterator指向了“當前刪除元素的後繼元素,或是end()”
因此,在遍歷容器的所有元素過程中通過erase刪除一個元素後,將erase的返回值賦給迭代變數:
1 for (VectorType::iterator it = someVector.begin(); it != someVector.end();) 2 { 3 if (*it== value) 4 { 5 it = someVector.erase(it); 6 } 7 else 8 { 9 ++it; 10 } 11 }
補充:map為何每次insert之後,以前儲存的iterator不會失效?
iterator這裡就相當於指向節點的指標,記憶體沒有變,指向記憶體的指標怎麼會失效呢(當然被刪除的那個元素本身已經失效了)。相對於vector來說,每一次刪除和插入,指標都有可能失效,呼叫push_back在尾部插入也是如此。因為為了保證內部資料的連續存放,iterator指向的那塊記憶體在刪除和插入過程中可能已經被其他記憶體覆蓋或者記憶體已經被釋放了。即使時push_back的時候,容器內部空間可能不夠,需要一塊新的更大的記憶體,只有把以前的記憶體釋放,申請新的更大的記憶體,複製已有的資料元素到新的記憶體,最後把需要插入的元素放到最後,那麼以前的記憶體指標自然就不可用了。特別時在和find等演算法在一起使用的時候,牢記這個原則:不要使用過期的iterator。