stl原始碼分析——map/multimap
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
相關文章
- 《STL原始碼剖析》-- stl_multimap.h原始碼
- 《STL原始碼剖析》-- stl_map.h原始碼
- 《STL原始碼剖析》-- stl_hash_map.h原始碼
- 詳解map、multimap、unordered_map、unordered_multimap
- map/ multimap容器
- STL裡的multimap使用詳解
- STL的map使用和分析
- sync.Map原始碼分析原始碼
- go sync.Map原始碼分析Go原始碼
- 《STL原始碼剖析》 -- stl_algo.h原始碼Go
- 《STL原始碼剖析》-- stl_algobase.h原始碼Go
- 《STL原始碼剖析》-- stl_hashtable.h原始碼
- 《STL原始碼剖析》-- stl_multiset.h原始碼
- 《STL原始碼剖析》-- stl_set.h原始碼
- 《STL原始碼剖析》-- stl_tree.h原始碼
- 《STL原始碼剖析》-- stl_heap.h原始碼
- 《STL原始碼剖析》-- stl_slist.h原始碼
- 《STL原始碼剖析》-- stl_queue.h原始碼
- 《STL原始碼剖析》-- stl_stack.h原始碼
- 《STL原始碼剖析》-- stl_deque.h原始碼
- 《STL原始碼剖析》-- stl_list.h原始碼
- 《STL原始碼剖析》-- stl_pair.h原始碼AI
- 《STL原始碼剖析》-- stl_vector.h原始碼
- 《STL原始碼剖析》-- stl_iterator.h原始碼
- 《STL原始碼剖析》-- stl_uninitialized.h原始碼Zed
- 《STL原始碼剖析》-- stl_alloc.h原始碼
- Go語言——sync.Map原始碼分析Go原始碼
- 《STL原始碼剖析》-- stl_relops.h原始碼
- 《STL原始碼剖析》-- stl_hash_set.h原始碼
- 《STL原始碼剖析》-- stl_construct.h原始碼Struct
- 《STL原始碼剖析》-- memory原始碼
- STL:map用法總結
- 《STL原始碼剖析》-- stl_config.h原始碼
- 【Java X 原始碼剖析】Map的原始碼分析--JDK1.8-仍在更新Java原始碼JDK
- STL原始碼剖析——vector容器原始碼
- C++_STL—容器Map篇C++
- STL中map用法詳解
- 詳解Java 容器(第④篇)——容器原始碼分析 - MapJava原始碼