vec.begin()是容器的第0個元素,vec.end()是容器最後乙個元素的下乙個元素。
新增元素(insert, push)也可能使迭代器失效,容器可能會重新分配記憶體。
刪除元素也會使指向被刪元素的迭代器失效;對於vec.erase(iter),容器vec中刪除迭代器iter所指的元素,並返回iter的下乙個元素。
不要儲存和使用vec.end()所返回的迭代器,因為插入和刪除操作都會使其失效
序列性容器::(vector和list和deque)
erase迭代器不僅使所指向被刪元素的迭代器失效,而且使被刪元素之後的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值為下乙個有效的迭代器。
所以正確方法為::
for( iter = c.begin(); iter != c.end(); )
iter = c.erase(iter);
關聯性容器::(map和set比較常用)
erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要採用erase(iter++)的方式刪除迭代器,
所以正確方法為::
for( iter = c.begin(); iter != c.end(); )
c.erase(iter++);
tips:
其實對於list兩種方式都可以正常工作
C 迭代器失效
眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作 view plaincopy to clipboardprint?iter vec....
c 迭代器失效
眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作 view plaincopy to clipboardprint?iter vec....
C 迭代器失效
原文 眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作 view plaincopy to clipboardprint?iter v...