STL中用erase 方法遍歷刪除元素

2021-06-22 00:01:51 字數 3361 閱讀 3408

stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器(如:vector 、deque);另一類是以不連續的節點形式儲存的容器(如:list、set、map)。在使用erase方法來刪除元素時,需要注意一些問題。

在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用:

正確使用方法1      std::list< int> list;

std::list< int>::iterator itlist;

for( itlist = list.begin(); itlist != list.end(); )

else

itlist++; }

或正確使用方法2      std::list< int> list;

std::list< int>::iterator itlist;

for( itlist = list.begin(); itlist != list.end(); )

else

itlist++; }

下面是兩個錯誤的使用方法:

錯誤使用方法1      std::list< int> list;

std::list< int>::iterator itlist;

for( itlist = list.begin(); itlist != list.end(); itlist++)

} 或

錯誤使用方法2      std::list< int> list;

std::list< int>::iterator itlist;

for( itlist = list.begin(); itlist != list.end(); )

else

itlist++; }

錯誤使用方法2:同上。

這裡「++」運算子與我們平常的理解剛好相反,erase( itlist++) 是先獲取下乙個元素的位置在刪除; erase( ++itlist) 是刪除以後再獲取下乙個元素的位置。

正確使用方法      std::vector< int> vec;

std::vector< int>::iterator itvec;

for( itvec = vec.begin(); itvec != vec.end(); )

else

itlist++; }

注意:vector、deque 不能像上面的「正確使用方法2」的辦法來遍歷刪除。

2009-01-08 08:34 by

canaan

2009-01-09 11:03 by

herbert

多謝cannan提點,不過用你提供的更簡單的用法似乎還是有點漏洞,舉個例子:

假如有乙個列表 shiplist,裡面的內容是0、1、2、3...9, 如果要從中刪除那些取餘3後為0或為1的數,刪除後應該得出的結果是 2、5、8。

但如果是這樣操作:

std::::iterator it;

for( it = shiplist.begin(); it != shiplist.end(); it++)

這樣的話會有兩個問題,乙個是得出的結果是 1、2、4、5、7、8(沒有刪除取餘3後等於1的數);另外乙個問題是當執行到列表中最後乙個元素(即shiplist.end() - 1 )時,迭代器可能還會執行兩次「++」,如果是這樣那麼it就到達了 shiplist.end() + 1 的位置,這樣也會報錯。

2009-01-15 11:30 by

無名劍你的第二種方法在vs03下是正確的,但在05或08下會出問題,因為迭代器失效了,還是遵循c++標準比較好

2009-01-15 18:23 by

herbert

@無名劍

是嗎?vs其它版本我沒測試過,不過在vs08執行是沒問題的喔...

2009-05-30 13:08 by

xu這裡「++」運算子與我們平常的理解剛好相反,erase( itlist++) 是先獲取下乙個元素的位置在刪除; erase( ++itlist) 是刪除以後再獲取下乙個元素的位置。

為什麼會這樣呢?我好像沒看到這方面的資料,有這方面的說明嗎?

2009-08-05 12:15 by

xxt轉到我的空間,謝謝:)

2010-03-20 11:53 by

kidst

erase( itlist++) 是先獲取下乙個元素的位置再刪除; erase( ++itlist) 是刪除以後再獲取下乙個元素的位置。

我覺得不應該這樣理解。

我認為,erase(itlist++)是itlist先傳遞值給erase(),然後再自增;

erase(++itlist)是先自增,然後再把自增後的值傳遞給erase(),這個是出錯的根源。

2011-02-24 14:28 by

ami謝謝了

2011-04-19 11:01 by

daniel

1.2010-03-20 11:53 by kidst

erase( itlist++) 是先獲取下乙個元素的位置再刪除; erase( ++itlist) 是刪除以後再獲取下乙個元素的位置。

我覺得不應該這樣理解。

我認為,erase(itlist++)是itlist先傳遞值給erase(),然後再自增;

erase(++itlist)是先自增,然後再把自增後的值傳遞給erase(),這個是出錯的根源。

----同意kidst上述觀點

2.2009-01-09 11:03 by herbert

多謝cannan提點,不過用你提供的更簡單的用法似乎還是有點漏洞,舉個例子:

假如有乙個列表 shiplist,裡面的內容是0、1、2、3...9, 如果要從中刪除那些取餘3後為0或為1的數,刪除後應該得出的結果是 2、5、8。

但如果是這樣操作:

std::::iterator it;

for( it = shiplist.begin(); it != shiplist.end(); it++)

這樣的話會有兩個問題,乙個是得出的結果是 1、2、4、5、7、8(沒有刪除取餘3後等於1的數);另外乙個問題是當執行到列表中最後乙個元素(即shiplist.end() - 1 )時,迭代器可能還會執行兩次「++」,如果是這樣那麼it就到達了 shiplist.end() + 1 的位置,這樣也會報錯。

----出錯是因為在for迴圈中多了一次自增操作,這樣,在餘0之後,自增了兩次,當然就把餘1的數漏掉了

2011-08-31 17:54 by

siryang

明顯有個問題, a b c d

刪除了b之後,itend指向d+1

再刪除d,itend指向d+2,it不移動,還指向d,d是個錯誤的指標。

如果不報錯就是死迴圈。否則程式就崩...

STL中用erase 方法遍歷刪除元素

stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在使用erase方法來刪除元素時,需要注意一些問題。在使用 list set 或 map遍歷刪除某些元素時可以這樣使用 正確使用方法1 s...

STL中用ERASE 方法遍歷刪除元素

stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在使用erase方法來刪除元素時,需要注意一些問題。在使用 list set 或 map遍歷刪除某些元素時可以這樣使用 正確使用方法1 s...

STL中用ERASE 方法遍歷刪除元素

stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在使用erase方法來刪除元素時,需要注意一些問題。在使用 list set 或 map遍歷刪除某些元素時可以這樣使用 正確使用方法1 s...