c 防止迭代器失效

2021-07-04 11:51:58 字數 701 閱讀 9509

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...