在介紹關聯容器之前,我們需要了解名為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 的元素以鍵 ...