最近在刷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 ...