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-->插入或删除.
STL之关联容器的映射底层的更多相关文章
- ###STL学习--关联容器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...
- STL之关联容器---set, mutilset, map, mutilmap
STL的容器分为序列容器和关联容器.它们所表达的数据结构各有不同: 序列容器:vector(变长数组), list(链表), queue(队列), heap(堆算法)等 关联容器:set/mutils ...
- STL之关联容器
关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...
- 【STL】关联容器 — hash_set
容器hash_set是以hash table为底层机制的,差点儿所有的操作都是转调用hash table提供的接口.因为插入无法存储同样的键值,所以hash_set的插入操作所有都使用hash tab ...
- 【STL】关联容器 — hashtable
C++ 11哈希表已被列入标准列.hashtable这是hash_set.hash_map.hash_multiset.hash_multimap的底层机制.即这四种容器中都包括一个hashtable ...
- STL - 常用关联容器代码 - set & multiset
代码如下: /* 5. set & multiset */ set<string> cities{ "Braunschweig", "Hanover& ...
- cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器
cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...
- STL_关联容器 VS C++ hashmap
红黑树和哈希表区别: http://m.blog.csdn.net/article/details?id=52133283 关于STL中关联容器的几个问题: (1)为何map和set的插入删除效率比用 ...
- STL 笔记(二) 关联容器 map、set、multimap 和 multimap
STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可 ...
随机推荐
- 【Linux】 CentOS免密登录
#sudo ssh-keygen -t rsa #sudo ssh-copy-id ${ipAddress}
- dxf组码
值 说明 -5 APP:永久反应器链 -4 APP:条件运算符(仅与 ssget 一起使用) -3 APP:扩展数据 (XDATA) 标记(固定) -2 APP:图元名参照(固定) -1 APP:图元 ...
- new Buffer 生成二进制数据
node编辑环境下: > new Buffer("admin")<Buffer 61 64 6d 69 6e> 通过post请求,服务端接收到是流数据,必须把流数 ...
- ssd运行过程中遇到的bug
1.出现以下错误: 没有添加环境变量: https://github.com/weiliu89/caffe/issues/4 可以看到当前PYTHONPATH不再ssd1里面,所以需要修改,修改之后就 ...
- Python应该怎样实现快速入门?
作为一名Python爱好者,我也想跟大家分享分享我自学Python的一些小经验.搬来你的小板凳,听听看吧.也许,你会很有收获,也许你也走上了自学Python的不归路.开讲啦~ 首先,你要有自信心,要明 ...
- No-3.算数运算符
01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理四则运算 运算符 描述 实例 + 加 10 + 20 = 30 - 减 10 - 20 = -10 * 乘 1 ...
- 四种方案解决ScrollView嵌套ListView问题 [复制链接]
以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollVie ...
- 字符与数字的转换:sprintf和sscanf
目录 字符与数字的转换:sprintf和sscanf 简单介绍 实例 运行结果 字符与数字的转换:sprintf和sscanf 简单介绍 sprintf和sscanf都是stdio.h头文件中的函数, ...
- 笔试算法题(48):简介 - A*搜索算法(A Star Search Algorithm)
A*搜索算法(A Star Search Algorithm) A*算法主要用于在二维平面上寻找两个点之间的最短路径.在从起始点到目标点的过程中有很多个状态空间,DFS和BFS没有任何启发策略所以穷举 ...
- 笔试算法题(16):二叉树深度计算 & 字符串全排列
出题:要求判断二元树的深度(最长根节点到叶节点的路径): 分析:二元递归不容易使用循环实现 解题: struct Node { int value; Node *left; Node *right; ...