很多時候會這麼寫
std::mapmmapitem;
for( auto it = mmapitem.begin(); it != mmapitem.end(); ++it)
一般情況下不會出錯
但是如果在迴圈裡面對mmapitem做一些操作,比如刪除的時候,++it的計算結果就會出錯
因此如果在迴圈中有可能會做刪除操作的時候這樣寫會比較好
for( auto it = mmapitem.begin(); it != mmapitem.end(); )
如果迴圈中會插入資料的也有可能會出問題,map不是vector,插入的資料很有可能在當前it之前,這個時候新加入的元素不會被遍歷。
如果在it之後則會被遍歷,因此結果是不確定的。因此這樣的操作需要根據不同的容器做特殊處理。
總之就是對於容器的迭代器不能那麼隨意的使用,很有可能出現一些很難查明的bug
更正一下:
實際上stl容器提供的erase方法一般會返回乙個iterator指向下乙個節點,在刪除的是後直接修正迭代器即可
STL 容器與迭代器
迭代器 迭代器是泛化的指標 但並不是指標 用法和指標類似,利用迭代器對容器中的元素序列的操作。格式舉例list itrerator it 迭代器本身是乙個物件,這個物件可以遍歷stl容器內部全部的物件,它能夠反覆地對stl容器內容進行訪問。迭代器所提供的基本操作如下所示 a.獲取當前被指向的元素,用...
STL中 容器 演算法 迭代器 之間的關係
最近一直在看侯捷寫的 stl原始碼剖析 小有想法。故此一記 1,三者之間聯絡 每個容器都有專屬的迭代器,而演算法通過迭代器對容器中的元素進行操作。2,容器 容器能夠通過模版的方法,裝下各種型別的節點元素。3,迭代器是一種smart pointer 迭代器是一種行為類似指標的物件。迭代器所指向的物件為...
STL中容器vector迭代器失效的相關問題
無法通過迭代器 操作遍歷整個stl容器。記作 第一層失效。無法通過迭代器訪問迭代器所指向的記憶體。記作 第二層失效。insert i,value 在迭代器i前插入乙個元素value,返回指向value迭代器 erase i 刪除迭代器i位置的元素,返回指向後乙個元素的迭代器 i insert i,v...