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之关联容器的映射底层的更多相关文章

  1. ###STL学习--关联容器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...

  2. STL之关联容器---set, mutilset, map, mutilmap

    STL的容器分为序列容器和关联容器.它们所表达的数据结构各有不同: 序列容器:vector(变长数组), list(链表), queue(队列), heap(堆算法)等 关联容器:set/mutils ...

  3. STL之关联容器

    关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...

  4. 【STL】关联容器 — hash_set

    容器hash_set是以hash table为底层机制的,差点儿所有的操作都是转调用hash table提供的接口.因为插入无法存储同样的键值,所以hash_set的插入操作所有都使用hash tab ...

  5. 【STL】关联容器 — hashtable

    C++ 11哈希表已被列入标准列.hashtable这是hash_set.hash_map.hash_multiset.hash_multimap的底层机制.即这四种容器中都包括一个hashtable ...

  6. STL - 常用关联容器代码 - set & multiset

    代码如下: /* 5. set & multiset */ set<string> cities{ "Braunschweig", "Hanover& ...

  7. cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器

    cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...

  8. STL_关联容器 VS C++ hashmap

    红黑树和哈希表区别: http://m.blog.csdn.net/article/details?id=52133283 关于STL中关联容器的几个问题: (1)为何map和set的插入删除效率比用 ...

  9. STL 笔记(二) 关联容器 map、set、multimap 和 multimap

    STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可 ...

随机推荐

  1. 新萝卜家园Ghost版Win10系统X32极速装机版2015年4月

    来自:系统妈,系统下载地址:http://www.xitongma.com/windows10/2015-03-30/6638.html 新萝卜家园Ghost Win10 X32 10041电脑城极速 ...

  2. PPTP的搭建

    一.准备 1.检查是否支持pptp modprobe ppp-compress-18 && echo yes yes支持 2.是否开启tun cat /dev/net/tun 返回ca ...

  3. Shiro的subject实质上是当前执行用户的特定视图。

    Shiro的subject实质上是当前执行用户的特定视图. 通过org.apache.shiro.SecurityUtils可以查询当前执行用户: Subject currentUser = Secu ...

  4. Discuz3.1登录QQ互联显示redirect uri is illegal(100010)的解决

    QQ互联最近也是BUG不断,引起了很多用户的不满,从早前关闭群组功能,到发布2.0接口标准,引发系列站长用户的连锁反应.而Discuz从X3开始,为了应对QQ互联的2.0接口标准,采用了云平台来整合Q ...

  5. 网络基础编程_5.4聊天室-IOCP服务器

    聊天室-IOCP服务器 main 创建完成端口内核对象(CreateIoCompletionPort) 获取核心数并创建线程(GetSystemInfo + CreateThread) 创建套接字并绑 ...

  6. CAD使用DeleteXData删除数据(com接口)

    主要用到函数说明: MxDrawEntity::DeleteXData 删除扩展数据,详细说明如下: 参数 说明 pzsAppName 删除的扩展数据名称,如果为空,删除所有扩展数据 c#代码实现如下 ...

  7. docker数据卷的管理和使用

    数据卷的使用,数据库可以保证如果容器出现问题但是数据不丢失的作用,比如MySQL/date下的数据 或者Nginx根目录下的index.html 查看数据卷 [root@docker ~]# dock ...

  8. bin/hadoop checknative

    bin/hadoop checknative #检查是否支持本地库 [root@node01 ~]# hadoop checknative19/05/28 23:12:46 INFO bzip2.Bz ...

  9. Java中9大内置基本数据类型Class实例和数组的Class实例(转载)

    https://www.jianshu.com/p/58976c8bf1e1

  10. 远程连接mysql数据库

    远程连接mysql数据库需要以下步骤(改表法): 1.数据源(数据库服务器)对要访问数据库进行授权: 2.本地库(本地)连接: 具体方法: 1. 进入数据服务器,输入cmd进入控制台:输入 mysql ...