STL之关联容器的映射底层

STL的关联容器有set, map, multiset, multimap.用于实现它们的底层容器有划入标准的rb_tree和待加入标准的hashtable.

底层容器rb_tree为上层容器提供了一种有序的服务.关键步骤时间复杂度为O(lgN);

底层容器hashtable为上层容器提供的是无序的服务,但其关键步骤的时间复杂度为O(1).

那么上层容器是怎么映射到底层容器中去的呢?下面以set和map为例,说明它们是如何映射到rb_tree和hashtable的.


1 rb_tree模板头



对于rb_tree的节点,其实只是保存了Value对象,并没有直接保存Key.

也就是说rb_tree只能直接看到Value,而看不到Key.因此要为rb_tree提供一个间接获取Key的方法.

即KeyOfValue, 它负责从Value获取对应的Key, 用于rb_tree中需要用到key值(比较)的地方.


2 hashtable模板头


与rb_tre一样, hashtable也是如此.它通过ExtractKey来提取Value对应的Key.


3 set

3.1 set的特点

键值就是实值,即key = value


3.2 set到rb_tree映射

1) set模板头



2) 到rb_tree的映射




key_type 与 value_type都是set的 Key.


3.3 set到hash_table的映射

1) set模板


2) 到hashtable的映射



4 map


4.1 map特点

通常键值与实值不等,即 key != value,为用户提供了一种key到value映射服务.


4.2 map到rb_tree映射







4.3 map到hashtable映射






在hashtable中看到的只是pai<const Key, T>.


5 总结


5.1 rb_tree

value--(KeyOfValue)-->key---(Campare)->插入或删除


5.2 hashtable


value--(ExtractKey)--> key --(HashFcn)--> hashcode--(%n)--> bkt_num-->插入或删除.




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值