STL源码剖析---关联式容器map
什么是map
map是STL中关联式容器的一种,所谓关联式容器,元素是按关键字来保存和访
问的,而序列式容器中的元素则是按它们在容器中的位置来顺序保存和访问的。
本片博客的主角map中,存储的不是一般的数据,而是一个个的键值对,我们称
之为pair,pair键值对由两部分组成:键值key和实值value。key与value之间具
有一一映射的关系。通常在查找过程中,我们通常都是通过key值来找value值。
这也满足了关联式容器的定义,通过key值关键字来保存和访问。
现实中有很多这种数据需要我们用map来存储,比如一个人与他的身份证号。
字典当中英文单词与中文含义等等。
map的底层是有由红黑树实现的(与set / multimap / multiset相同)。所以这里提几
个值得注意的点。
- 用map查找数据的效率是O(logn),算是一种比较快的方法。(但还是略逊unordered_map一筹,人家底层是哈希表,查询是O(1),这儿就不多介绍了)
- 因为红黑树的实质是平衡二叉搜索树,所以map中插入的数据会自动排序。且根据你创建的map的模板参数来决定是升序排列还是降序排列,默认是升序排列。
- 我们通过key值比较来确认每一个pair的存储位置,所以,在map中存储的数据必须能够比较大小。
- 我们不能够修改map中的每个pair的键值key,这是因为红黑树是搜索树,且按照key值排列的,修改key值会破坏整个红黑树的结构。但是修改pair中的实值value是被允许的。
- map中键值不能够重复,这也是他和multimap的唯一区别.
下面是map的STL源码结构:
template <class Key, class Compare = less<Key>, class Alloc = alloc>
class set {
public:
// typedefs:
typedef Key key_type;//键值key
typedef Key value_type;//实值value(其实底层红黑树中key和value都是key值,
//只是取名不同)
typedef Compare key_compare;//比较器,默认传的是less,
//也可以显示的传函数指针或仿函数。
typedef Compare value_compare;
private:
typedef rb_tree<key_type, value_type,
identity<value_type>, key_compare, Alloc> rep_type;
rep_type t; // red-black tree representing set
};
map中存储的键值对
上面已经说过,map中存储的键值对叫pair,那么我们来看看源码中pair的结构
是什么样的:
template<class _T1, class _T2>
struct pair
{
typedef _T1 first_type; /// @c first_type is the first bound type
typedef _T2 second_type; /// @c second_type is the second bo