1.关联式容器的概念
上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引。它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是用红黑树实现,红黑树是一种基本平衡的二叉搜索树,红黑树的原理wiki上讲得很清楚,书中只是把算法实现在了底层而已,在SGI STL中RB-tree是作为底层数据结构供其他容器配接用,因此关联容器可以看做都是adaptor模式的应用。
关联式容器的概念类似于关联式数据库,为获得良好的搜索效率,一般用平衡二叉树作为底层实现,而红黑树是一种应用广泛的平衡兴致很好的BST。元素被插入关联容器中时,根据特定规则,比如,map根据键大小,set根据元素本身大小在树中摆放(这就是关联的含义)。也正是这个原因,关联容器没有头尾之说,因此涉及头尾的操作如pop,push之类的函数都没有
2.准备知识—RB-tree
将RB-tree泛化实现在STL框架之中是整个关联容器涉及的重中之重。下面分析RB-tree的实现
- RB-tree迭代器涉及
由关联容器的概念--不支持按序索引就知道它的迭代器肯定不是Random_access_iterator,实际上,它的迭代器是双向迭代器bidirecitonal_iterator,听起来好像list的迭代器,对吧?的确,使用起来很类似。- RB-tree内存配置与构造函数
使用std::alloc即可。由于是树结构,类似于链表结构,所以内存配置没有deque那么复杂。- RB-tree的元素操作
第一类:插入 第二类:查找 ----以方便供配接器们使用
3.set
- set概述
- 特性:所有元素会根据元素大小自动排序,所以呢,如果存入的是非对象类型,需要自己实现比较操作符,缺省是递增排序,set键值是合一的,这点与map不同,不能有相同的元素。
- 不能随意改变set元素值,这会破坏set的树组织结构,为了防止用户在不知情的情况下误操作,set<T>::iterator被定义为底层RB-tree的const_iterator,防止写入。
- set迭代器
- 双向的,不存在失效问题
- const的,不能随意写入
- set操作,见api好了
4.map
- map概述
- 特性:map的每个元素都是pair,按照键值排序,实值不参与排序
- 可以随意改变实值,但是不能随意改变键值
- map迭代器
- 不存在失效问题,双向
- 键值不可变,实值可变
- map操作,见API文档
5.multiset/multimap
允许元素重复,实现的代价是底层的红黑树实现变得更复杂。
6.hashtable
- hash_table概述
hash表就是散列表在STL里面的实现而已。
hash_map和hash_set底层的实现结构,也就是说,hash_map和hash_set也是adaptor的一种用法。
具体实现时,SGI STL用的是开链法防止冲突,底层用vector实现桶操作,因此hash_table的内存管理和构造还是比较麻烦的。 - hash_table迭代器
hash_table的迭代器(SGI实现)是单向的,因为没有必要双向。
hash_table的迭代器有失效问题。
hash_table是hash_map和hash_set的底层实现,因此它们的迭代器也会失效情形的。 - hash_table函数
主要是供需要配接的容器hash_map和hash_set调用。
7.hash_map
hash_map和普通map的区别是底层实现不同,因此区别由此而生,比如,hash_map的迭代器是单向的,普通map是双向的,hash_map搜索的复杂度是常数时间,map的复杂度是O(lgN),同样,由于底层不是红黑树,hash_map里面的元素不会自动有序。
8.hash_set
hash_set的接口与set接口也基本相同,但是同样的,hash_set里面的元素不会自动有序。
总结:理解了RB-tree和hash_table,就掌握了关联容器的精髓!
STL源码分析读书笔记--第5章--关联式容器的更多相关文章
-
STL源码剖析读书笔记--第四章--序列式容器
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
-
STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型 ...
-
STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
-
STL源码剖析读书笔记--第6章&;第7章--算法与仿函数
老实说,这两章内容还蛮多的,但是其实在应用中一点点了解比较好.所以我决定这两张在以后使用过程中零零散散地总结,这个时候就说些基本概念好了.实际上,这两个STL组件都及其重要,我不详述一方面是自己偷懒, ...
-
STL源码剖析读书笔记之vector
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...
-
重温《STL源码剖析》笔记 第五章
源码之前,了无秘密 ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap map priority-queue multiset li ...
-
重温《STL源码剖析》笔记 第三章
源码之前,了无秘密. --侯杰 第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼 ...
-
重温《STL源码剖析》笔记 第四章
源码之前,了无秘密 ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap map priority-queue multiset li ...
-
Stl源码剖析读书笔记之Alloc细节
阅读基础: Foo *pf = new Foo; 执行了两个步骤: 1)::operator new 向系统申请内存. 2) 调用Foo::Foo()构造函数构造实例. ==> 申请内存,构造 ...
随机推荐
-
Android内存泄漏
Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆的可能,所以写出来的 ...
-
Solr 5.x集成中文分词word,mmseg4j
使用标准分词器,如图: 使用word分词器 下载word-1.3.jar,注意solr的版本和word分词的版本 将文件word-1.3.jar拷贝至文件夹C:\workspace\Tomcat7.0 ...
-
Xcache和memcache的比较
Xcache 和 memcached 是两个不同层面的缓存,不存在可比性. Xcache 是 php 底层的缓存,它将PHP程式编译成字节码(byte code),再透过服务器上安装对应的程式来执行P ...
-
Java 第三周总结
1.本周学习总结 2.书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pub ...
-
“XcodeGhost”病毒之后,苹果更应注…
虽然大家都在期待中秋假期的到来,不过让开发者挺闹心的一件事就是这几天网上.朋友圈以及各种群中炒得沸沸扬扬的"XcodeGhost"病毒事件,就连央视也惊动了!! 事件起源 事件起源 ...
-
Python redis 简单介绍
Python redis 简单介绍 1.安装 终端输入: pip(or)pip3.6 install redis 安装成功 2.哈哈,发现我并没有redis服务可以访问,所以到这里,在本机安装了red ...
-
datagridview表头全选
参与程序http://www.codeproject.com/KB/grid/CheckBoxHeaderCell.aspx 这里老外写的一个控件,他少了委托重载的一个方法.先写一个控件 public ...
-
win10 磁盘占用高--- 禁用用户改善反馈 CompatTelRunner.exe
1. 2.右键点开[这台电脑],点[管理],点[服务和应用程序]点[服务],在右边框里把[superfetch] [windows search][HomeGroupListener] [HomeGr ...
-
Mybatis联合查询记录,左连接参数操作
公司业务需求要做个列表的排序 而实际排序的字段不再本库中,需要跨库去拿到字段,因为是微服务体系架构,不可能Left join跨库的表,所以决定调用一次跨服务的API拿到排序相关的对象,里面包含需要排序 ...
-
第一次c++团队合作项目第三篇随笔
这次终于想出来了上次问题的解决方法,就是用多态的方法,让小兵,建筑和英雄继承于Object类,通过指针能实现信息的传递. 同时我也完善了地图中每个Pane类的信息,包括每个格子的位置信息,state( ...