STL源码剖析之map set multimap multiset【2013.12.10】
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
map 关联容器(key-value对应),set 关联容器( 集合) 默认不能重复
multimap 同map,multiset同set,只是允许重复
SGI STL 中 这四种容器 都是用 RH-tree红黑树构造的。虽然无法指定自己的底层实现容器。
但是可以自定义的比较方法以及空间配置器。看map的声明定义代码:
Compare 就是构建红黑树时用到的比较方法,判断节点存储位置,默认less(小于)
Alloc 则是内存配置器啦,默认alloc
都知道默认的map和set在插入构造红黑树的时候就是培训的,所以根据比较函数的递增和递减排序可以构造不同的红黑树,
遍历的时候也会呈现出不同的排序方式,递增或递减;multimap和multiset也是一样的。
根据配接器的概念,只要根据上层接口,对应使用底层接口,从而实现与底层容器不一样的结构;
可以这么说,map和set也是一种应用与容器的配接器,如stack和queue类似。
于是乎,SGI STL 根据hashtable的特性,又实现了 hash_map,hash_set,hash_multimap,hash_multiset 四种对应的容器
都是以hashtable作为底层容器,实现的。
因为构建hashtable需要指定hashfunc(根据值寻找键方法),所以这几种map set的声明方式也就不同,因而也就不能作为严格意义上的容器配接器。
看代码:
HashFunc 就是构建 哈希表的键值确定,即将key转换成SGI STL中hashtable的key(hashtable的key为实型),然后用hashtable的确定对应键(hashtable默认是对键值取模,确定在键队列的键位置),默认使用SGI STL内部的hash转换方法(具体请看 hashtable小结);
QqualKey 则是类似之前map中的Compare,判断hashtable键值是否相同的。
Alloc 则是空间配置器,默认alloc 和map一样。
当然因为hashtable的特性,hash_map也就只能迁就,如:
hashtable没有后退--,所以hash_map的迭代器也就只有 ++ 遍历了。其他hash_set等也一样。
【*】map的在进行插入的是,返回的是一个pair<bool,iterator>,判断插入成功与否是,取pair的first变量,即bool 为真则成功,反之失败。second为插入节点的迭代器。
【*】map的对应节点的删除,只会使当前迭代器失效。具体其他容器的失效情况请进传送门
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611