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