一、關聯式容器概念
1、關聯式容器
關聯式容器也是用來存儲數據的,與序列式容器不同的是,其裏面存放的是<key,value>結構的鍵值對,在數據檢索時比序列式容器效率更高。
2、鍵值對
用來表示具有一一對應關係的一種結構,該結構中包含兩個成員變量 key 和 value ,key 表示鍵值,value 表示與 key 所對應的信息。
template<class T1,class T2>
struct pair{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair()
:first(T1())
,second(T2())
{}
pair(const T1& a, const T2& b)
:first(a)
, second(b)
{}
};
二、樹形結構的關聯式容器
根據應用場景的不同,STL共實現了兩種不同結構的管理式容器:樹型結構與哈希結構。樹形結構的關聯式容器主要有四種: map 、set 、multimap 、 multiset。這四種容器的共同點是:使用平衡二叉搜索樹(即紅黑樹)作爲其底層的結果,容器中的元素是一個有序的序列。
1、map
1、map的介紹
- map是一種關聯式容器,他按照特定的次序(按照key來比較)存儲key值和value值組合而成的元素;
- 在map中,鍵值key通常用於排序和惟一的標識元素,而值value 中存儲與此鍵值key 關聯的內容。鍵值 key 和 值value的類型可能不同,並且在map 的內部,key 與 value 通過成員類型 value_type綁定在一起,爲其取別名稱爲 pair;
- 在內部,map中的元素總是按照鍵值 key 進行比較排序的;
- map中通過鍵值訪問單個元素的速度通常比 unorder_map 容器慢,但 map 允許根據順序對元素進行直接迭代(即對map中的元素進行迭代時,可以得到一個有序的序列);
- map支持下標訪問符,即在[ ]中放入 key,就可以找到與 key對應的 value;
- map通常被實現爲平衡二叉搜索樹(紅黑樹);
2、map的使用
void MapTest() {
map<string, string> m;
//插入數據
m.insert(pair<string, string>("peach", "桃子"));
m.insert(make_pair("banana","香蕉"));
m["apple"] = "蘋果";
cout << m.size() << endl;
//用迭代器去遍歷 map 中的元素,可以得到一個按照 key 排列的序列
for (auto x : m)
cout << x.first << "--->" << x.second << endl;
cout << endl;
//map 中的鍵值對 key 是唯一的,如果 key 存在將插入失敗
auto ret = m.insert(make_pair("peach","桃子"));
if (ret.second)
cout << "<peach,桃子>不在map中,以及插入" << endl;
else
cout << "已存在,插入失敗" << ret.first->first << "--->"
<< ret.first->second << "failed" << endl;
//刪除 key 爲"apple"的元素
m.erase("apple");
if (m.count("apple") == 1) {
cout << "Have" << endl;
}
else
cout << "Nohave" << endl;
}
operator[ ]的原理是:
用<key,value()>構造一個鍵值對,然後調用insert()函數將該鍵值對插入到 map中;
如果key 已經存在,插入失敗,insert 函數返回該 key 所在位置的迭代器;
如果key 不存在,插入成功,insert 函數返回新插入元素所在位置的迭代器;
operator[ ]函數最後將insert 返回值是將鍵值對中的 value 返回;
3、map的總結
- map 中的元素時以鍵值對的方式給出的;
- map 中的key 是唯一的,並且不能進行修改;
- 默認按照小於的方式對key 進行比較;
- map 中的元素如果用迭代器去遍歷,可以得到一個有序的序列;
- map 的底層爲紅黑樹,查找效率比較高 O(log2N)
- 支持[ ]操作符,operator[ ]實際進行插入查找;
2、multimap
1、multimap的介紹
multimap 基本上和 是一樣的,唯一的不同是:map 中的 key 是唯一的,而 multimap 中 key 是可以重複的;
2、multimap的使用
multimap 的接口參考 map,功能都是類似的;
3、multimap的總結
- multimap中的key 是可以重複的;
- multimap中的元素默認將 key 按照小於來比較;
- multimap中沒有重載 operator[ ]操作;
- 使用時與 map 包含的頭文件相同;
3、set