stl原始碼分析——map/multimap

Stay alone發表於2020-11-06

1. 概念

map是一種關聯式容器。map中所有元素都會根據元素的鍵值自動排序。map中所有的元素都是pair,同時擁有key和value。

2. 原始碼分析

以G2.9為例,以下是map的部分原始碼實現:

template <class Key, 
			class T, 
			class Compare = less<Key>,    //預設採用遞增排序
			class Alloc = alloc>
class map
{
public:
	typedef Key key_type;  //鍵值型別
	typedef T data_type;   //資料(實值)型別
	typedef T mapped_type;
	typedef pair<const Key, T> value_type;   //元素型別(鍵值/實值) Key為const,不可修改
	typedef Compare key_compare;  //鍵值比較函式
private:
	typedef rb_tree<key_type, value_type,
		select1st<value_type>, key_compare, Alloc> rep_type;  //以紅黑樹表現map
	rep_type t;
public:
	typedef typename rep_type::iterator iterator;
	...
};
template <class Arg, class Result>
struct unary_function {
	typedef Arg argument_type;
	typedef Result result_type;
};

//拿第一個元素,即取key
template <class Pair>
struct select1st :
	public unary_function<Pair, typename Pair::first_type>
{
	const typename Pair::first_type& operator() (const Pair& x) const {    //過載"()"操作符
		return x.first;
	}
};

1) map內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為RB樹(Red-Black Tree)。RB樹的統計效能要好於一般平衡二叉樹,所以被STL選擇作為了關聯容器的內部結構;

2) map的迭代器型別是rep_type::iterator,其值是可以改變的;但又因為typedef pair<const Key, T> value_type中Key值被定義為const型別,故鍵值是不可修改的;

3) map是通過select1st<value_type>演算法獲取Key值,基本思想是傳入一個pair<first, second>,返回pair的first,即對應的key值; 

4) map中的key必須是獨一無二的,其insert()呼叫的是rb_tree的insert_unique();

    multimap允許擁有相同的鍵值,其insert()呼叫的是rb_tree的insert_equal();

3. 用法總結

可參考http://cplusplus.com/reference/map/map/?kw=map

 

 

相關文章