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是否存在会受这种插入的影响。