今天同事在碼碼時遇到這麼乙個問題:
這段**報錯
for (qmap::iterator it = m_projectinfos.begin(); it != m_projectinfos.end(); ++it)
}
邏輯很簡單,遍歷map,滿足條件就刪除迭代器當前指向的元素。但是迭代器失效了,所以在++it時會報錯。
序列容器
對序列容器(如vector、list、deque),由於它們使用了連續分配的記憶體,刪除乙個元素將會導致其後的所有元素前移,因而不能使用erase(it++)的方式,而是直接刪除當前迭代器,即erase(it),其erase()方法會返回下乙個有效的迭代器。
for (iter = cont.begin(); iter != cont.end();)
如果此時在erase中對迭代器進行++操作就會出現最上面同事犯的錯誤。
關聯容器
對關聯容器(如map、set),刪除當前的迭代器,只會使當前的迭代器失效,只要在erase時對迭代器自增就可以了,即erase(it++)。不同的是,關聯容器的erase方法的返回型別是void。
for (qmap::iterator it = m_projectinfos.begin(); it != m_projectinfos.end();)
else
}
這樣就不會出現迭代器失效而報錯的問題了。
m_projectinfos.erase(it++)這一句分為如下過程:it首先作為erase()的實參,但是it是物件型別變數,它會首先填充乙個臨時變數,然後由於引數處理優先於函式呼叫,所以接下來執行了it++的操作,最後erase方法釋放掉臨時變數指向的位置。
總結:
STL迭代器失效
vector 1.當插入 push back 乙個元素後,end操作返回的迭代器肯定失效。此時first和end操作返回的迭代器都會失效。3.當進行刪除操作 erase,pop back 後,指向刪除點的迭代器全部失效 指向刪除點後面的元素的迭代器也將全部失效。deque迭代器的失效情況 1.在de...
STL 迭代器失效
迭代器失效 指向不再存在的元素的迭代器。無效迭代器的使用未定義,可能會導致嚴重的執行錯誤。眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的...
stl 迭代器失效
1 對於基於連續記憶體的容器,容器元素的增刪,有可能會導致迭代器的失效。考慮 int main int argc,char ar 2 通過memory可以記憶體的變化,刪除之前是 1 2 3 刪除之後是2 3,刪除iter1會導致迭代器iter2和ri失效。迭代器和引用,底層都是指標,刪除iter1...