STL中erase 的陷阱

2021-08-21 07:38:01 字數 997 閱讀 2770

最近在刷stl原始碼剖析這本書時,對於vector的erase()函式引起了我的注意

在刪除單個元素時是這樣定義的:

iterator erase(iterator position)

--finish;

destroy(finish);

return

position;

}

erase()將position+1後面的元素拷貝給了position,並將最後乙個位置-1,那麼刪除後的vectors是不是乙個新容器,書上沒說,但是容器的長度變了,返回的指標還是position。指標沒變。erase(it)後,iterator不變,但是裡面的元素已經是下乙個,如果需要指向刪除元素的前面乙個元素的迭代器iterator就要-1。

for(vector::iterator it=arr.begin(); it!=arr.end(); it ++) 

}

該方法中利用了後++的特點,這個時候執行maptest.erase(it++);這條語句分為三個過程

1、先把it的值賦值給乙個臨時變數做為傳遞給erase的引數變數

3、再呼叫erase函式,釋放掉第一步中儲存的要刪除的it的值的臨時變數所指的位置。

iteratort儲存的不是新的vector,iterator為野指標,繼續++就會報錯,此時iterator應該如果想繼續迭代,應該重新獲取vector:

方法一

for(vector::iterator it=arr.begin(); it!=arr.end(); )

else

}

方法二

for(vector::iterator it=arr.begin(); it!=arr.end(); )

else

}

雖然上面兩種方法達到了乙個相同的效果,但是,更提倡使用第二種,第一種方法只適用於windows平台,並不是標準庫的支援

同理,map也存在這種問題,解決方法一樣

STL中erase 用法陷阱

erase 函式的功能是用來刪除容器中的元素 刪除某個容器裡的某個元素 c.erase t 看似乙個簡單的動作,然而對不同型別的容器,內部卻做了截然不同的事情,後面介紹。假設有這樣乙個題目,將某個容器中所有滿足條件n x的元素刪除,按照常規的思路應該有類似這樣的 假設container和contai...

STL的erase 陷阱 迭代器失效總結

下面材料整理自internet 著作。stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在使用erase方法來刪除元素時,需要注意一些問題。1.list,set,map容器 在使用 lis...

STL中的erase 方法

stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在stl中用earse 方法刪除乙個元素很簡單,基本上也不會出什麼錯,但是在遍歷刪除某條件下的元素時就有可能會弄錯了。在list set ...