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章--关联式容器的更多相关文章

  1. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  2. STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法

    1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型 ...

  3. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  4. STL源码剖析读书笔记--第6章&第7章--算法与仿函数

    老实说,这两章内容还蛮多的,但是其实在应用中一点点了解比较好.所以我决定这两张在以后使用过程中零零散散地总结,这个时候就说些基本概念好了.实际上,这两个STL组件都及其重要,我不详述一方面是自己偷懒, ...

  5. STL源码剖析读书笔记之vector

    STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...

  6. 重温《STL源码剖析》笔记 第五章

    源码之前,了无秘密  ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap   map priority-queue multiset li ...

  7. 重温《STL源码剖析》笔记 第三章

    源码之前,了无秘密. --侯杰 第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼 ...

  8. 重温《STL源码剖析》笔记 第四章

    源码之前,了无秘密  ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap   map priority-queue multiset li ...

  9. Stl源码剖析读书笔记之Alloc细节

    阅读基础: Foo *pf = new Foo; 执行了两个步骤: 1)::operator new 向系统申请内存. 2) 调用Foo::Foo()构造函数构造实例.  ==> 申请内存,构造 ...

随机推荐

  1. linux之应用开发杂记(一)

    1.Shell 当前目录 $(pwd) 2.Samba的配置 sudo apt-get install samba Samba的配置文件是/etc/samba/smb.conf [global] se ...

  2. SQLite的介绍 操作Sqlite 具体实例

    1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能 ...

  3. Android gingerbread eMMC booting

    Android gingerbread eMMC booting This page is currently under construction. The content of this page ...

  4. Asp.net MVC 3实例学习之ExtShop(四)——完成产品列表页

    在完成产品列表页前要做一些准备功夫.首先是去下载MvcPager用了为产品列表分页.下载的可能是基于MVC 2的,没关系,可以用在MVC 3上.如果有担心,下载源代码重新编译一次好了.下载后将DLL添 ...

  5. JSON 之 SuperObject(1)

    一直盼着 Delphi 能够直接支持 "正则表达式" 与 "JSON"; Delphi 2009 刚来的时候, 有了 JSON, 但不好, 那时尝试过一点. 这 ...

  6. ListItem选中时只改变文字的颜色

     继承父状态,然后使用Selector 如果是用Linearlayout里面动态添加Linearlayout的情况,就要代码控制了 // 就是为了改变颜色.                     l ...

  7. Asp.Net生命周期系列三

    上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(HttpApplication). 第二:建立了HttpModule列表,项目经理(HttpRunTime)就 ...

  8. 介绍 Android 的 Camera 框架

    总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...

  9. 基于Html5的爱情主题网站–表白神器(第二版)

    第二版在第一版的基础上增加了一个动态3D的白云效果背景,鼠标悬浮在页面上云朵会向屏幕Z轴方向运动,在第一人称视角看来向着云朵方向前进的,由此形成一个伪3D效果.有点绕,直接看demo就能理解了.3D白 ...

  10. 【转】Bootloader之uBoot简介(转)

    原文网址:http://blog.csdn.net/sadamoo/article/details/8139946 来自http://blog.ednchina.com/hhuwxf/1915416/ ...