C Primer 學習筆記之關聯容器

2022-02-17 16:43:07 字數 4197 閱讀 9619

關聯容器

關聯容器支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是map和set。map的元素以鍵-值對的形式組織:鍵用作元素在map的索引,而值則表示所儲存和讀取的資料。set僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。set和map型別的物件不允許為同乙個鍵新增第二個元素。如果乙個鍵必須對應多個例項,則需使用multimap或mutiset型別,這兩種型別允許多個元素擁有相同的鍵。

pair型別:在標頭檔案utility中定義。

pair的建立和使用:

#include

<

utility

>

pair

<

string

,int

>

author(

"peter",

30);

cout

<<

author.first

<<"\t

"<<

author.second

<<

endl;

//可以直接訪問資料成員

//使用typedef進行簡化

typedef pair

<

string

,string

>

student;

student s1,s2(

"aaa",

"bbb");

s1.first="

ccc"

;s1.second="

ddd";//

使用make_pair函式生成乙個新的pair物件

string

first="

eee"

,second="

fff"

;student s3

=make_pair(first,second);

map型別:map是鍵-值對的集合。

map::key_type 在map中用做索引的鍵的型別

map::value_type 乙個pair型別

map迭代器進行解引用將產生pair型別的物件:

map

<

string

,int

>

::iterator map_it

=word_count.begin();

cout

<<

map_it

->

first

<<""

<<

map_it

->

second

<<

endl;

使用下標訪問map物件:

新增鍵-值對,有兩種實現方法。可以用insert成員實現,或者,先用下標操作符獲取元素,然後給獲取的元素賦值。

使用下標訪問map與使用下標訪問陣列或vector的行為截然不同;用下標訪問不存在的元素將導致在map容器中新增乙個新的元素,它的鍵即為該下標的值。

方法一:

map

<

string

,int

>

word_count;

word_count[

"peter"]

=10;//

相當於增加乙個鍵值對

//建立乙個map物件,用來記錄每個單詞出現的次數,十分簡潔。

map<

string

,int

>

word_count;

string

word;

while

(cin

>>

word)

方法二:使用insert:

map

<

string

,int

>

word_count;

word_count.insert(map

<

string

,int

>

::value_type(

"aaa",

1));

//用insert方法重寫單詞統計程式

map<

string

,int

>

word_count;

string

word;

while

(cin

>>

word)

}

查詢並讀取map中的元素:

用下標操作符,是一種比較簡單的方法,但是該方法有***,就是當該鍵不在map容器中,那麼下標操作會插入乙個具有該鍵的新元素。

map容器提供了兩種操作:count和find

m.count(k) 返回m中k的出現次數,對於map物件只能是1或0,而對於mutimap容器,則可能會出現更多的值。

m.find(k) 返回按k索引返回的迭代器

count方法用於在map中查詢指定鍵是否存在的問題,而find方法適合用於解決在map容器中查詢指定鍵對應的元素的問題。

//

讀取元素而又不插入新元素

intoccurs;

map<

string

,int

>

::iterator it

=word_count.find(

"foobar");

//不存在,則返回end迭代器

if(it

!=word_count.end())

//可能找不到

從map物件中刪除元素

m.erase(k) 刪除m中鍵為k的元素。返回值為被刪除元素的個數,對於map容器而言,其值必然是0或1。

m.erase(p) 從m中刪除迭代器p所指向的元素。返回值為void型別。

m.erase(b,e) 從m中刪除一段由一對迭代器範圍的元素。返回值為void型別。

map物件的迭代遍歷:

map

<

string

,int

>

word_count;

word_count[

"aaa"]

=1;word_count[

"bbb"]

=2;word_count[

"ccc"]

=3;map

<

string

,int

>

::const_iterator iter

=word_count.begin();

while

(iter

!=word_count.end())

set型別:

map容器是鍵-值對的集合,而set容器只是單純的鍵的集合。當只想知道乙個值是否存在時,使用set容器是最合適的。

在set中新增元素:

set

<

int>

set1;

pair

<

set<

int>

::iterator,

bool

>p=

set1.insert(1);

//返回pair型別物件,包含乙個迭代器和乙個布林值

set1.insert(2);

intarr=;

set<

int>

set2;

set2.insert(arr,arr+3

);//

返回void型別

從set中獲取元素:與map方法使用類似,使用find和count函式。

multimap和multiset型別:

map和set容器中,乙個鍵只能對應乙個例項。而multimap和multiset型別則允許乙個鍵對應多個例項。其支援的操作分別於map和set的操作相同,只有乙個例外:multiply不支援下標運算。

《C Primer》學習筆記 關聯容器

一,pair型別 pairp1 建立乙個空pair指標,兩個元素分別是t1,t2型別,採用值初始化 pairp1 v1,v2 first成員初始化為v1,second成員為v2 make pair v1,v2 建立新的pair物件 p1 p2 p1 p2 p.first 返回first成員 p.se...

C Primer學習筆記 10 關聯容器

題記 本系列學習筆記 c primer學習筆記 主要目的是討論一些容易被大家忽略或者容易形成錯誤認識的內容。只適合於有了一定的c 基礎的讀者 至少學完一本c 教程 本文主要討論c 標準庫中的關聯容器 associative container 內容主要涉及map,set,multimap和multi...

c primer 學習筆記18 關聯容器

關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative containers 支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map 和set。map 的元素以鍵 值 key val...