11.1 使用關聯容器
分類
有序容器
- map
- set
- multimap
- multiset
無序容器
- unordered_map
- unordered_set
- unordered_multimap
- unordered_multiset
注:set只儲存key,map儲存key/value,有multi前綴的key可重複。
map的基本使用
經常使用下標運算符訪問map中的值,下標爲鍵。當map中並未存在對應鍵時,則下標運算符會創建一個新元素,其鍵爲下標值,併爲其初始化。set的基本操作
經常使用find函數來確認是否存在對應鍵。
11.2 關聯容器概述
順序容器中的很多操作,包括位置操作、插入操作等,對關聯容器沒有意義,因此也不被關聯容器支持。
初始化關聯容器方式與順序容器類似,既可以列表初始化,也可以拷
注:對非multi前綴的關聯容器,初始化時會自動過濾重複鍵(鍵值對)
關鍵字必須嚴格弱序,在定義關聯容器時,可以指定自定義的比較函數,例如
bool compare(const A& a1, const A& a2){...}
multiset<A, decltype(compareA)*> set1(compare);
其中比較操作類型爲函數指針。
pair類型
頭文件:utility
訪問權限:public
成員:first、second
創建方式:
- 括號初始化或列表初始化
- make_pair(v1,v2)
- pair
11.3 關聯容器操作
類型別名(通過域操作符使用)
- key_type:鍵類型
- mapped_type:值類型
- value_type:對於set爲鍵類型,對於map爲pair類型;
注:map的value_type所生成的pair,其鍵類型爲const類型。
迭代器
無論是否爲const迭代器,都不可以改變鍵;
常用inserter插入值或對;泛型算法
- 一般使用關聯容器自帶的find算法。
- 通過inserter來將關聯容器作爲一個目的位置。
不存在copy(c.begin(),v.end(),back_inserter(c))。
刪除:實參爲鍵或迭代器
下標
注:關聯容器的下標返回類型與解引用迭代器返回類型不同。下標返回mapped_type,而解引用返回value_type。
find與count
- 可以避免下標帶來的鍵增加;
- 利用關聯容器中,鍵相同的元素相鄰存儲的特性,可以結合find與count,利用迭代器遍歷同鍵元素。
注:通過lower_bound和upper_bound迭代器也可以實現相似操作。
11.4 無序容器
- 組織方式:哈希函數和==運算符
- 有序容器與無序容器可以實現相互轉化;
- 存儲方式:桶(性能依賴於哈希函數及桶的數量和大小);
- 生成哈希值
- 使用hash類型對象生成
- 標準庫爲內置類型定義了hash模板
- 自定義類型需要提供自己的hash模板
//未重載 == 運算符
unordered_multiset<Class, decltype(hasher)*, decltype(eqOp)*>;
//重載了 == 運算符
unordered_multiset<Class, decltype(hasher)*>;