在c++ std::map上面用迭代器移除元素
序列性容器
::(vector)
erase
迭代器不僅使所有指向被刪元素的迭代器失效,而且使被
刪元素之後的所有迭代器失效,所以不能使用
erase(
iter
++)的方
式,但是
erase
的返回值為下乙個有效的迭代器,所以
正確方法為::
for(
iter
= c.begin
();
iter
!= c.end
(); )
iter
= c.erase
(iter);
關聯性容器::(map)
erase
迭代器只是被刪元素的迭代器失效,但是返回值為
void
,所以要採用
erase(
iter
++)的方式刪除迭代器,
正確方法為::
for(
iter
= c.begin
();
iter
!= c.end
(); )
c.erase
(iter
++);
tips:
其實對於
list
兩種方式都可以正常工作
先宣告:下面的文章是針對windows的用法,因為std::map的erase函式的windows的實現版本是返回乙個std::map的迭代器,但是stl標準裡面的該函式的返回值確是:
map.erase有3個過載:
void erase ( iterator position );
size_type erase ( const key_type& x );
void erase ( iterator first, iterator last );
。所以下面的**中的最後乙個例子僅僅可以在windows下的map下執行。
stl的map表裡有乙個erase方法用來從乙個map中刪除掉指令的節點
eg1:
mapmaptest;
typedef map::iterator iter;
iter iter=maptest.find(key);
maptest.erase(iter);
像上面這樣只是刪除單個節點,map的形為不會出現任務問題,
但是當在乙個迴圈裡用的時候,往往會被誤用,那是因為使用者沒有正確理解iterator的概念.
像下面這樣的乙個例子就是錯誤的寫法,
eg2:
for(iter iter=maptest.begin();iter!=maptest.end();++iter)
}
看樣子貌似非常正常的一 段**。在乙個map中尋找值為***的項並刪除。
但是實際上這個**是完全錯誤的,會導致無法預料的結果。
問題就在#1處。一 旦你erase了乙個iterator指向的內容,這個iterator就無效了。
這時候你再對這個iterator做任何操作其結果都是未定義 的。
那麼該怎麼辦呢?
還好,對於map這種以指標構建起來的容器來說,可以保證乙個元素刪除了,不影響指向其它元素的迭代器。
因 此就可以這樣做(《c++standard library》上建議的正確做法):
for(auto iter1 = themap.begin(); iter1 != themap.end(); )
else
}
這 個遍歷把迭代器的自增從for頭部中取出,丟到迴圈體中去。#1處,iter1++這個運算先自增,但是卻返回了自增前的迭代器的乙個臨時拷貝。然後這個 臨時迭代器指向的內容被刪除了,但是iter1本身已經自增到下乙個位置了,不受影響。
STL基本用法總結
1 vector的基本用法 include 1 定義 vectors 定義乙個空的 vector 物件,儲存的是 int型別的元素。vectors n 定義乙個含有n個 int元素的 vector 物件。2 基本操作 s i 直接以下標方式訪問容器中的元素。s.front 返回首元素。s.back ...
STL之vector用法總結
vector是一種順序容器,有大小限制,但是可以動態的擴充套件,不能減小對應的空間,同陣列一樣,是線性排列的,在其尾不插入刪除效率很高,中間的插入刪除效率一般,可以向陣列一樣隨機訪問表中的元素。stl中的資料結構,都可以使用自定義的資料型別,便於擴充套件。標頭檔案 include using nam...
待總結 STL容器 C 中STL用法超詳細總結
stl 對定義的通用容器分三類 順序性容器 關聯式容器和容器介面卡。順序性容器 是一種各元素之間有順序關係的線性表,是一種線性結構的可序群集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。這個位置和元素本身無關,而和操作的時間和地點有關,順序性容器不會根據元素的特點排序而...