STL用法總結

2021-07-02 12:16:44 字數 1931 閱讀 1889

在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 對定義的通用容器分三類 順序性容器 關聯式容器和容器介面卡。順序性容器 是一種各元素之間有順序關係的線性表,是一種線性結構的可序群集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。這個位置和元素本身無關,而和操作的時間和地點有關,順序性容器不會根據元素的特點排序而...