STL源码剖析---关联式容器map详解

本文详细介绍了STL中的关联式容器map,包括map的基本概念、存储的键值对、迭代器的使用以及常用操作。map底层由红黑树实现,提供O(logn)的查找效率,并自动按照键值排序。文章还探讨了map的insert操作和operator[]的功能,强调了operator[]无法区分元素是已存在还是新插入的,而at()函数在键不存在时会抛出异常。
摘要由CSDN通过智能技术生成

什么是map

map是STL中关联式容器的一种,所谓关联式容器,元素是按关键字来保存和访

问的,而序列式容器中的元素则是按它们在容器中的位置来顺序保存和访问的。

本片博客的主角map中,存储的不是一般的数据,而是一个个的键值对,我们称

之为pair,pair键值对由两部分组成:键值key和实值value。key与value之间具

有一一映射的关系。通常在查找过程中,我们通常都是通过key值来找value值。

这也满足了关联式容器的定义,通过key值关键字来保存和访问。

现实中有很多这种数据需要我们用map来存储,比如一个人与他的身份证号。

字典当中英文单词与中文含义等等。


map的底层是有由红黑树实现的(与set / multimap / multiset相同)。所以这里提几

个值得注意的点。

  1. 用map查找数据的效率是O(logn),算是一种比较快的方法。(但还是略逊unordered_map一筹,人家底层是哈希表,查询是O(1),这儿就不多介绍了)
  2. 因为红黑树的实质是平衡二叉搜索树,所以map中插入的数据会自动排序。且根据你创建的map的模板参数来决定是升序排列还是降序排列,默认是升序排列。
  3. 我们通过key值比较来确认每一个pair的存储位置,所以,在map中存储的数据必须能够比较大小。
  4. 我们不能够修改map中的每个pair的键值key,这是因为红黑树是搜索树,且按照key值排列的,修改key值会破坏整个红黑树的结构。但是修改pair中的实值value是被允许的。
  5. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值