STL源码分析:map

STL里面map是基于一颗红黑树来实现的,map其实是对红黑树的接口做了一下封装。
对于底层的红黑树来说,map底层的红黑树的实例化为:

  typedef rb_tree<key_type, value_type, 
                  select1st<value_type>, key_compare, Alloc> rep_type;

而value_type为pair.

 typedef pair<const Key, T> value_type;

也就是说,对于map来说,它是把数据从key到value的映射关系写成一个pair,再把整个pair作为value插入到红黑树里面去。

而模板实参 select1st<value_type> 则是rb_tree的KeyOfValue参数的实际值,说明map准备把每个value的第一个元素作为key.

map的其他没啥好说的。
主要是看看的它对取下标运算符的重载:

  T& operator[](const key_type& k) {
    return (*((insert(value_type(k, T()))).first)).second;
  }

也就是说使用operator[] 运算符的时候,它会先尝试插入一个元素value_type(k,T()).k是我们给定的key,而value则是类别T的默认构造函数做出来的value。
如果参数k存在于map中,那倒也没事。
如果参数k不存在map中,那就是新插入一个key-value进去,这样map的size啥的可就变化了。
例如:

#include <map>
using namespace std;
int main()
{
	map<int, int> storage;
	printf("%d\n", storage[110]);
	printf("%d\n", storage.size());
	system("pause");
	return 0;
}

输出的是0和1,说明插入成功了。
上面这个例子说明了,我们如果使用了operator[],要千万注意用find()或count()查看当前key是否存在会受这种插入的影响。

发布了307 篇原创文章 · 获赞 268 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/103657961