STL源码剖析之map set multimap multiset【2013.12.10】

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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值