C 關聯容器

2021-09-30 01:54:34 字數 3926 閱讀 7719

在介紹關聯容器之前,我們需要了解名為pair的標準庫型別,它定義在頭文utility中。

下表為pair的操作

pair    p1;                     建立乙個空的pair物件,它的兩個元素分別是t1和t2型別,採用值初始化

pair

p1(v1,v2)

; 建立乙個pair物件,它的兩個元素分別是t1和t2型別,其中first成員初始化為v2,second成員初始化為v2。

make_pair

(v1,v2) 以v1,v2值建立乙個新的pair物件,其元素型別分別是v1,v2型別

p1p1==p2 如果兩個pair物件的first和second值依次相等,則它們相等

p.first 返回p中名為first的資料成員

p.second 返回p中名為second的資料成員

乙個pair 儲存兩個資料成員,它們都是public的,分別命名為first,second。可以看出pair是生成特定型別的模板。

標準庫提供了8個關聯容器

按關鍵字有序儲存元素

map 關聯陣列;儲存(關鍵字-值)對

set 關鍵字即值

multimap 關鍵字可重複出現的map

multiset 關鍵字可重複出現的set

無序集合

unordered_map 用雜湊函式組織的map

unordered_set 用雜湊函式組織的set

unordered_multimap 雜湊組織的map,關鍵字可重複

unordered_multiset 雜湊組織的set,關鍵字可重複

在本文中只講set和map,其他型別的使用都可以模擬。

map是乙個排序的關聯容器,它包含具有惟一鍵的鍵值對。通過使用compare函式對鍵進行排序。搜尋、刪除和插入操作具有對數複雜度。對映通常被實現為紅黑樹。map定義在標頭檔案map中。

1.定義map

map共有3種建構函式用於定義和初始化。

map    m;                 建立乙個名為m的空map物件,其鍵和值型別分別為k和v型別

mapm(m2)

; 建立乙個m2的副本m,m和m2必須要有相同的鍵和值型別

mapm(b,e)

; 建立map型別的物件m,儲存迭代器b和e標記範圍內所有元素的副本。

元素的型別必須能轉換位pair<

const k,v>

2.map額外的型別別名
map

::key_type v1 v1的型別是k

mapmap

::value_type v3 v3的型別是pair<

const k,v>

3.向map中新增元素

給map新增元素有兩種方式:一是使用insert操作實現。二是先用下標獲取元素,讓然後給獲取的元素賦值。

首先,介紹使用insert操作向map中新增元素

先定義乙個map,用來具體地說明如何向map中新增元素

#include

mapint> word_count;

在對乙個map進行insert操作前,必須記住元素型別是pair。現在向word_count中新增元素。

word_count.

insert()

;word_count.

insert

(make_pair

(word,1)

);word_count.

insert

(pairint>

(word,1)

);word_count.

insert

(mapint>

::value_type

(word,1)

);

這是向word_count中新增元素的4種方法,可以看出建立乙個pair最簡單的方法是在引數列表中使用{}初始化。

map m;

m.insert

(e); e是map

::value_type型別的物件

m.insert

(beg,end)

; beg和end是迭代器,它們的值的型別是map

::value_type。

這個操作會向m中新增在beg和end之間範圍的元素,

m.insert

(iter,e) e是乙個用在vaule_type型別的值。

如果鍵不在m中,則建立新元素,並以迭代器iter為起點搜尋新元素儲存的位置。

第二種用下標獲取元素,讓然後給獲取的元素賦值。

mapint> word_count;

word_count[

"student"]=

1

可以看出,map使用下標與陣列類似,但是map的下標是鍵,不一定是陣列下標中的數字。

4.刪除map中的元素

從map容器中刪除元素用erase操作,它有三個版本,如下:

m.

erase

(k); 從m中刪除每個關鍵字為k的元素

返回乙個size_tyep值,指出刪除元素的數量。

m.erase

(iter)

; iter是乙個迭代器,從m中刪除iter指向的元素。

iter必須指向m中乙個真實的元素,不能等於m.

end(

)。 返回乙個指向iter之後元素的迭代器,若iter指向m中的尾元素。則返回m.

end(

)。m.

erase

(beg,end)

; 刪除迭代器對beg和end所表示的範圍中的元素。返回e。

5.訪問map中的元素

map中下標讀取元素的缺點是當不存在該元素時會自動新增,有時這是我們不希望看到的。所以map提供了另外兩個操作:count和find,用於檢查某個鍵是否存在而不會插入該鍵。

m.

count

(k) 返回m中k出現次數

m.find

(k) 如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭代器

6.訪問map中的元素
mapint>

::const_iterator map_it=word_count.

begin()

;while

(map_it!=word_count.

end())

1.set的定義
set word =

;

2.向set中新增元素
set  set;

//方法一,直接插入

set1.

insert

("the");

//方法二,使用迭代器

set.

insert

(v.begin()

,v.end()

);

3.訪問set中的元素

set沒有下標操作,為了通過鍵從set中獲取元素,可使用find運算。如果僅是判斷某個元素是否存在,也可使用count操作,返回值只能是1或0。

參考《c++ primer第五版中文版》

c 關聯容器

1.map建構函式 mapm 普通初始化 mapm m2 複製初始化法 mapm b,e 另乙個map物件的迭代器初始化法 注意 1 鍵值型別必須定義 操作符號,資料訪問時需要呼叫。2 m aaa 下表訪問方式導致的結果是,若鍵對應的值不存在,則插入該鍵值對應的預設值。2.map插入操作 m.ins...

C 關聯容器

1.關聯容器是通過關鍵字來儲存和訪問資料的。關聯容器分為兩大類 map和set。其中,map是通過鍵值對來操作的,這裡的鍵就是關鍵字,值就是對應的資料。例如 mapm 定義了乙個空的map變數m,它的關鍵字型別是int,關鍵字對應的值的型別是int。可以將map理解成為函式,關鍵字是自變數,關鍵字對...

C 關聯容器

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