【C++自學筆記】STL-詳細解析map、mulitmap(關聯式容器)

一、關聯式容器概念

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

 

4、multiset

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章