演算法設計與分析 常用的STL容器(二)

2021-10-07 22:53:59 字數 3619 閱讀 7390

stl容器很多,每乙個容器就是乙個類模板

①順序容器

②介面卡容器

③關聯容器

可參考演算法設計與分析——常用的stl容器(一)

演算法設計與分析——常用的stl容器(三)

關聯容器中的每個元素有乙個key(關鍵字),通過key來儲存和讀取元素,這些關鍵字可能與元素在容器中的位置無關,所以關聯容器不提供順序容器中的 front(), push_front()、back()、push_back()以及pop_back()操作。

(1)set(集合容器)/ multiset(多重集合容器)

①set和 multiset都是集合類模板,其元素值稱為關鍵字。set中元素的關鍵字是唯一的, multiset中元素的關鍵字可以不唯一,而且預設情況下會對元素按關鍵字自動進行公升序排列,所以查詢速度比較快,同時支援交差和並等一些集合上的運算,如果需要集合中的元素允許重複,那麼可以使用 multiset

②由於set中沒有相同關鍵字的元素,在向set中插入元素時,如果已經存在則不插入。 multiset中允許存在兩個相同關鍵字的元素,在刪除操作時刪除 multiset中值等於elem的所有元素,若刪除成功返回刪除個數,否則返回0

set/multiset的成員函式如下

empty()

:判斷容器是否為空。

size()

:返回容器中的實際元素個數

insert()

:插入元素。

erase()

:從容器中刪除乙個或幾個元素。

clear()

:刪除所有元素。

count

(k):返回容器中關鍵字k出現的次數。

find

(k):如果容器中存在關鍵字為k的元素,返回該元素的迭代器,否則返回end

()值。

upper_bound()

:返回乙個迭代器,指向關鍵字大於k的第乙個元素。

lower_bound()

:返回乙個迭代器,指向關鍵字不小於k的第乙個元素。

begin()

:用於正向迭代,返回容器中第乙個元素的位置。

end(

):用於正向迭代,返回容器中最後乙個元素後面的乙個位置。

rbegin()

:用於反向迭代,返回容器中最後乙個元素的位置。

rend()

:用於反向迭代,返回容器中第乙個元素前面的乙個位置。

例如有以下程式:

#include

using

namespace std;

void

main()

printf

("\n");

multiset<

int>ms;

multiset<

int>

::iterator mit;

ms.insert(1

);ms.

insert(3

);ms.

insert(2

);ms.

insert(4

);ms.

insert(2

);printf

("ms: ");

for(it=ms.

begin()

;mit!=ms.

end(

);mit++

)printf

("\n");

}

執行結果:

s:12

34ms:122

34

(2)map(對映容器)/multimap(多重對映容器)

①map和 multimap都是對映類模板。對映是實現關鍵字與值關係的儲存結構,可以使用乙個關鍵字key來訪問相應的資料值 value。set/multiset中的key和 value都是key型別,而map/multimap中的key和 value是乙個pair類結構,pair類結構的宣告形式如下:

struct pair
也就是說,pair中由兩個分量(二元組),first為第乙個分量,在map中對應key,second對應value。

例如定義乙個物件p1標識乙個平面座標點,並輸入座標:

pair<

double

,double

>p1;

cin>>p1.first>>p1.second;

同時pair對==,!=,<>,<=,>=共6個運算子進行過載,提供了按照字典序對元素進行大小比較的比較運算子模板函式。

map/multimap利用pair的<運算子將所有元素(即key -value對)按key的公升序排列,以紅黑樹的形式儲存,可以根據key快速地找到與之對應的 value(查詢時間為o(log2n))

map中不允許關鍵字重複出現,支援[]運算子;而multimap中允許關鍵字重複出現,但不

支援[運算子。

②map/multimap的主要成員函式如下:

empty()

:判斷容器是否為空。

size()

:返回容器中的實際元素個數。

map[key]

:返回關鍵字為key的元素的引用,如果不存在這樣的關鍵字,則以key作為關鍵字插入乙個元素(不適合 multimap)

insert

(elem)

:插入乙個元素elem並返回該元素的位置。

clear()

:刪除所有元素。

find()

:在容器中查詢元素。

count()

:容器中指定關鍵字的元素個數(map中只有1或者0)

begin()

:用於正向迭代,返回容器中第乙個元素的位置。

end(

):用於正向迭代,返回容器中最後乙個元素後面的乙個位置。

rbegin()

:用於反向迭代,返回容器中最後乙個元素的位置。

rend()

:用於反向迭代,返回容器中第乙個元素前面的乙個位置。

③以map為例進行說明。在map中修改元素非常簡單,這是因為map容器已經對[]運算子進行了過載。例如:

map<

char

,int

>mymap;

mymap[

'a']=1

;

獲得map中乙個值的最簡單方法如下:

int ans=mymap[

'a']

;

只有當map中有這個關鍵字(『a』)時才會成功,否則自動插入乙個元素,其關鍵字為』a』,對應的值為int型別預設值0.使用者可以用find()方法來發現乙個關鍵字是否存在,傳入的引數是要查詢的key。

④例如有以下程式:

#include

#include

using

namespace std;

intmain()

執行結果:

[a,1]

[b,2

][c,

3]

STL常用容器與演算法

stl共有六大元件 1 容器。2 演算法。3 迭代器。4 仿函式。6 介面卡。stl容器的實現原理 stl來管理資料十分方便,省去了我們自己構建資料結構的時間.其實,stl的實現也是基於我們常見的資料結構.序列式容器 vector 陣列,元素不夠時再重新分配記憶體,拷貝原來陣列的元素到新分配的陣列中...

STL容器演算法迭代器的設計理念

1 stl的容器通過類模板技術,實現資料型別和容器模型的分離。2 stl的迭代器技術實現了遍歷容器的統一方法 也為stl的演算法提供了統一性,把容器和演算法有效的粘合在一起 3 stl的函式物件實現了自定義資料型別的演算法運算。演算法和函式物件 4 演算法通過函式物件 謂詞 實現自定義資料型別和基礎...

STL 容器的常用操作

基礎資料結構 deque 佇列 雙向表 list 雙向鍊錶 vector 單向鍊錶 include include include include include include include include includeusing namespace std int main01 a.pop ...