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_map和multimap容器
- STL使用篇__multimap
- map/ multimap容器
- map和multimap
- STL的map使用和分析
- sync.Map原始碼分析原始碼
- go sync.Map原始碼分析Go原始碼
- STL使用篇__map
- Go語言——sync.Map原始碼分析Go原始碼
- STL:map用法總結
- STL map 詳細用法
- STL原始碼剖析——vector容器原始碼
- 【Java X 原始碼剖析】Map的原始碼分析--JDK1.8-仍在更新Java原始碼JDK
- stl中map的基本用法
- 詳解Java 容器(第④篇)——容器原始碼分析 - MapJava原始碼
- Java容器 | 基於原始碼分析Map集合體系Java原始碼
- 【STL 原始碼剖析】淺談 STL 迭代器與 traits 程式設計技法原始碼AI程式設計
- set\list\map部分原始碼解析原始碼
- 不得不知道的Golang之sync.Map原始碼分析Golang原始碼
- C++(STL原始碼):37---仿函式(函式物件)原始碼剖析C++原始碼函式物件
- Retrofit原始碼分析三 原始碼分析原始碼
- 集合原始碼分析[2]-AbstractList 原始碼分析原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- Guava 原始碼分析之 EventBus 原始碼分析Guava原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- HDU 1004 Let the Balloon Rise(STL初體驗之map)
- 關於c++ STL map 和 unordered_map 的效率的對比測試C++
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- [譯] 原始碼對映(Source Map)簡介原始碼
- Java HashMap和Go map原始碼對比JavaHashMapGo原始碼
- C++ STL:std::unorderd_map 物理結構詳解C++