stl之關聯容器學習筆記1

2021-05-23 05:32:18 字數 3113 閱讀 8187

概述

stl定義了另一種容器,名曰關聯容器,關聯容器和順序容器的本質區別在於:關聯容器通過鍵key來儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器的大部分行為與順序容器相同,但其獨特之處在於支援鍵的使用。

stl提供了兩個基本的關聯容器

1、map:容器中以鍵值的形式來組織資料。鍵key代表了資料在容器中的索引,而值則是表示所儲存和讀取的資料。

2、set:僅包含乙個鍵,一般用於查詢某個鍵是否存在。

舉個例子:

字典是map的典型應用,字典中的字就是鍵,而字對應的內容解釋就是值。

在某些文書處理中,set用作關鍵字的集合,程式決定這些關鍵字是否遮蔽。

set和map所包含的元素都具有不同的鍵,換句話說,乙個相同的鍵不能在容器內出現兩次(乙個鍵無法對應多個值)。為了解決這個問題,標準庫引入了multimap和multiset型別,這兩種容器允許多個元素擁有相同的鍵。

舉個例子:

在**本的應用中,乙個人名(鍵)可能對應多個號碼(值),這時選用multimap較為合適。

pair型別

在討論關聯容器前,必須先引入乙個與之關係密切的stl型別,pair型別。

pair型別是單個的鍵值對,說明白點,map中的單個元素就是乙個pair型別元素,通過map迭代器進行解引用,得到的就是pair型別物件。

pair定義在utility標頭檔案中。

pair型別提供的操作有:

1、pairp1:建立乙個空的pair物件,它的兩個元素型別分別為t1,t2,採用值初始化(如string則初始化為"").

2、pairp1(v1,v2):建立乙個pair物件,它的兩個元素型別分別為t1,t2,其中第乙個成員初始化為v1,第二個成員初始化為v2.

3、make_pair(v1,v2):以v1和v2的值建立乙個新的pair物件,起元素型別分別為v1和v2的型別.

4、p15、p1==p2:如果兩個pair物件的first和second元素依次相等,則返回真。該運算使用其元素的==運算(也就是元素型別必須提供==操作).

6、p.first:返回p中第乙個的資料成員。

7、p.second:返回p中第二個資料成員。

技巧:pair型別的使用比較繁瑣,因此,如果需要定義多個相同的pair型別,可以使用以下形式

typedef pairname;

name shen("haha","hehe");

name wang("hoho","xixi");

map容器

在使用map前,必須包含map的標頭檔案。

在定義map的時候,必須指明map的鍵值型別。

如:mapphone_book;//鍵為string型別,值為string型別

建構函式:

1、mapm:建立乙個名為m的空map,鍵值型別分別為k和v。

2、mapm(m2):建立m2的副本m,m與m2必須有相同的鍵型別和值型別。

3、mapm(b,e):建立map型別的物件m,儲存迭代器b和e標記範圍內所有元素的副本(左閉合區間),元素型別必須能轉換為pair。

注意:使用關聯容器時,鍵的型別必須要有《操作符(比較操作符中的小於)。因為在向關聯容器中增加元素時,是按照嚴格弱排序來排列的,即小的在大的前面,所以要實現這種排序,必須定義《操作符。

定義的型別:

map::key_type:在map容器中,用作索引的鍵的型別。

注意:對map迭代器進行解引用時,得到的是乙個pair物件。那麼,完全可以對map迭代器做->操作,這樣比較簡潔,看下面的例子:

mapii_map;

...//插入元素

map::iterator ii_iter=ii_map.begin();

cout cout <<(*ii_iter).first;

map的操作

新增元素:

最常規的方法就是和順序容器一樣,使用map::insert成員函式插入元素。有以下三個版本:

1、m.insert(e):e是乙個value_type型別(pair)。如果e.first不在m中,則插入乙個值為e.second的新元素。反之,則保持m不變。

注意:該函式返回乙個pair型別物件,這個物件的first是指向鍵為e.first的元素的map迭代器,second是乙個bool型別的物件,表示是否插入了該元素。

2、m.insert(beg,end):beg和end是標誌著元素範圍的迭代器(左閉合區間)。迭代器指向的元素,必須為value_type型別。對於範圍內的所有元素,如果它的鍵在m中不存在,則將該鍵及其關聯的值插入到m中。返回void。

3、m.insert(iter,e):e是待插入的元素,型別必須為value_type(pair)。如果e.first不在m中,則建立新元素,並以迭代器iter為起點搜尋新元素儲存的位置。返回乙個迭代器,指向鍵為e.first的元素。

除了以上三種成員函式,還可以使用下標來實現新增元素。考慮以下的例子:

mapsi_map;

si_map["haha"]=1;

以上示例執行了這些操作:

1、在si_map中搜尋鍵為haha的元素,沒找到。

2、將乙個新的鍵值對插入si_map中,其中鍵位const string型別物件,儲存了haha.值為int的初始化值,為0。

3、讀取新插入的元素,並將它的值賦為1。

4、如果si_map中已經有haha這個鍵了,則將haha對應的值設定為1。

可見,map的下標即是元素的鍵。使用下標進行賦值時,如map中不存在給定的鍵,則新增這個鍵值。

查詢操作

提供兩個函式

1、m.count(k):返回m中鍵為k的元素出現的次數(對於map來說,只可能是0或1)

2、m.find(k):搜尋m中鍵為k的元素,如搜尋到,則返回指向這個元素的迭代器。否則,返回超出末端的迭代器。

刪除元素

1、m.erase(k):刪除m中鍵為k的元素。返回size_type型別的值,表示刪除的元素個數。(對於map來說,只可能是0或者1)

2、m.erase(p):從m中刪除迭代器p所指向的值。p必須指向m中確實存在的元素,當然不能等於m.end()。返回void。

3、m.erase(b,e):從m中刪除一段範圍內的元素(左閉合區間)。b和e必須標記m中的一段有效範圍。b和e要麼相等(刪除範圍為空),要麼b所指的元素必須在e所指的元素之前。返回void。

stl之關聯容器學習筆記2

set型別容器 set容器只是單純的鍵的集合,其中的鍵必須唯一,且不能修改 const 舉個例子 某軟體提供黑名單功能,其黑名單就可用set容器配置。在做某項操作前,先檢查黑名單。2 set中,value type不是pair型別,而是與key type相同的型別。因為只是單純的鍵集合,沒有關聯的值...

STL學習筆記 關聯容器

stl中常用的關聯容器有四種 set map mutimap multiset。這四種容器中的元素都是按照鍵有序排列的,因此關聯容器的鍵值必須是可比較的。如果鍵值是基本型別可以直接使用,如果鍵值是自定義型別,需要定義帶有比較謂詞的建構函式map中儲存著一系列的鍵值對兒,每個鍵對應乙個值,鍵類似有索引...

STL之關聯容器

1.set單重集合 不允許key重複 set作為乙個容器,也是用來儲存同一資料型別的資料型別,並且能從乙個資料集合中取出資料 c stl中標準關聯容器set,multiset,map,multimap內部採用的就是一種非常高效的平衡檢索二叉樹 紅黑樹 include using namespace ...