STL 在迴圈中使用erase報錯的情況

2021-10-02 19:19:03 字數 1054 閱讀 7735

之前想寫個程式,利用iterator遍歷list,然後用if語句刪除特定值

像下面這樣:

for

(list<

int>

::iterator iter=lst.

begin()

;iter!=lst.

end(

); iter++

) cout<<

*iter<}

但是不是正確結果,甚至有時候還會崩潰。

對於節點式容器(map, list, set)元素的刪除,插入操作會導致指向該元素的迭代器失效,其他元素迭代器不受影響。

對於順序式容器(vector,string,deque)元素的刪除、插入操作會導致指向該元素以及後面的元素的迭代器失效。

正確的寫法如下:

對於順序型容器,如vector

for

(vector<

int>

::iterator iter=arr.

begin()

;iter!=arr.

end();

)else

}

因為順序型容器的erase方法返回的是被刪除元素的下乙個元素的iter,雖然erase後當前元素之後的迭代器都失效了(這也是為什麼不能像list中++的原因),但是通過iter=arr.erase(iter),iter指向下乙個元素。

對於節點型容器,如list,map

for

(list<

int>

::iterator iter=lst.

begin()

;iter!=lst.

end();

)else

}

節點型容器的erase方法返回值是void。對於erase(iter++)可以這麼理解,先執行iter++,此時迭代器先指向下乙個,但iter++的返回值還是當前迭代器位置;之後erase,刪除節點。

以下是我在查閱中發現的比較好的部落格,可以參考:

參考1參考2

參考3

在vector的迴圈中呼叫erase

在使用vector的過程中,有時會遇到需要迴圈遍歷vector,並刪除符合指定條件的元素。當 指定條件 不複雜時,應該盡量使用erase remove if begin,end,func end 的形式來完成功能。但有時候 指定條件 過於複雜,不得不顯式地寫乙個for迴圈來處理。我們必須小心在意er...

在vector的迴圈中呼叫erase

在使用 vector的過程中,有時會遇到需要迴圈遍歷vector,並刪除符合指定條件的元素。當 指定條件 不複雜時,應該盡量使用erase remove if begin,end,func end 的形式來完成功能。但有時候 指定條件 過於複雜,不得不顯式地寫乙個for迴圈來處理。我們必須小心在意e...

在vector的迴圈中呼叫erase

在使用 vector 的過程中,有時會遇到需要迴圈遍歷 vector 並刪除符合指定條件的元素。當 指定條件 不複雜時,應該盡量使用 erase remove if begin,end,func end 的形式來完成功能。但有時候 指定條件 過於複雜,不得不顯式地寫乙個 for迴圈來處理。我們必須小...