源码之前,了无秘密  ——侯杰

  序列式容器                    关联式容器         

  array(build in)                  RB-tree

  vector                        set

    heap                        map

      priority-queue                multiset

  list                          multimap

  slist                       hashtable

  deque                        hash_set

    stack(配接器)                   hash_map

    queue(配接器)                  hash_multiset

                             hash_multimap

第五章:关联式容器

  定义:所谓关联式容器,观念上类似关联式数据库,每个元素都有一个键值(可以)和一个实值(value)

  关联式容器没有头尾,只有最大元素和最小元素

  树中根节点至任一节点的路径长度,即所谓该节点的深度。而根节点的深度永远是0,叶子节点的高度永远

  也是0(但是又有版本《数据结构与算法分析--c语言描述》、《大话数据结构》中定义的根节点深度是1,

  叶子节点的高度也是1)。各执一词,瞬间不淡定了。

  二叉搜索数,可提供对数时间的元素插入和访问。二叉搜索树的查找时很容易的,但是插入和移除麻烦

  点,如果删除的节点有左右子节点,则将右子树的最小节点取得需要删除的节点。

  平衡二叉搜索树:

    AVL Tree:任何节点的左右子树高度相差最多1

    RB-tree(红黑树):一颗特殊的二叉搜索树

      必须满足:1.每个节点要么是红要么是黑

           2.根节点必须是黑色的

             3.如果节点为红,其子节点必须为黑

           4.任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同。

    其他关于树和红黑树请查看另一篇博客: 

  set:所有的元素都会根据元素的键值自动被排序,set元素的键值就是实值,实值就是键值。

    set不允许两个元素有相同的键值。

    不可以通过set的迭代器改变set的元素值,因为set的元素值就是其键值,关系到set

    元素的排序规则,如果任意改变set元素值,会严重破坏set组织。

    set以RB-tree为底层机制,几乎所有的set操作都只是转调用RB-tree的操作行为。

  map:

    map的所有元素都是pair,同时拥有实值和键值。pair的第一元素被视为键值,第二元素被

    视为实值。map也不允许两个元素拥有相同的键值。

    map以RB-tree为底层机制,几乎所有的mapt操作都只是转调用RB-tree的操作行为。

  multiset:

    multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的

    插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()

  multimap: 

    multimap的特性以及用法和map完全相同,唯一的差别在于它允许键值重复,因此它的

    插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()

  hashtable

    二叉搜索树具有对数时间的表现,但这样的表现是基于一个输入数据有足够的随机性。而

    hashtable(散列表)的数据结构,在插入,删除,搜寻等操作上也具有常数平均时间的表现。

    使用hash function 会导致可能有不同的元素被映射到相同的位置(亦具有相同的索引)

    导致了碰撞问题。

    解决碰撞问题的方法有很多种:线性探测,二次探测,开链(STL使用)

  线性探测:容易导致主集团(primary clustering)的产生 (H+1,H+2,,,,H+i)

    对于碰撞一般采取的措施是如果计算出来的位置上已经有元素值了则

    循序往下一一寻找,直到没有元素为止。而进行元素搜寻时,如果计算出来的位置

    上的元素值与我们的搜寻目标不符,就循序向下一一寻找,直到找到吻合值,或者

    直到遇上空格元素。而元素的删除则必须采用惰性删除,只标记删除几号,实际删

    除操作则待表格重新整理时再进行。(主要是因为hash table中的每一个元素不仅

    表述它自己,也关系到其他元素的安排。

  二次探测:(主要用来解决主集团的问题)(H+1^2,H+2^2,,,,H+i^2)

  表格负载:假设表格的大小为质数,而且永远保持负载系数在0.5一下(也就是说超过

      0.5就重新配置并重新整理表格),那么就可以确定每插入一个新元素所需要的

      探测次数不多于2。

  表容量28个质数{53、97、193、389、769、1543、3079、6151...}

    Hi=H0 + i^2(mod M)

    H(i-1)=H0 + (i - 1)^2(Mod M)

    整理可得:

    Hi=H(i-1) + 2i -1(Mod M)

  开链法:在每一个表格元素中维护一个list;hash function 为我们分配某一个list

    然后在list上执行元素的插入,搜寻,删除等操作。

    开链法的表格重建与否的判断原则是:元素个数(包括新增元素)和bucket

    vector的大小来比。如果前者大于后者,就重建表格。

  

  hash_set:几乎所有的操作行为都是转调用hasht_table的操作工作。

    RB-tree有自动排序功能而hashtable没有,反应出来的结果就是,

    set的元素有自动排序功能而hash_set没有。

  hash_map:  

    RB-tree有自动排序功能而hashtable没有,反应出来的结果就是,

    set的元素有自动排序功能而hash_map没有。

  hash_multiset:

    与multiset完全相同,唯一的差别就是他的底层机制是hashtable,

    因此hash_multiset的元素不会自动排序。

    而hash_multiset与hash_set实现的唯一的差别在于,前者元素插入操作

    采用底层机制hashtable的insert_equal(),后者则是采用insert_unique()

  

  hash_multimap:

    与multimap完全相同,唯一的差别就是他的底层机制是hashtable,

    因此hash_multimap的元素不会自动排序。

    而hash_multimap与hash_map实现的唯一的差别在于,前者元素插入操作

    采用底层机制hashtable的insert_equal(),后者则是采用insert_unique()

    

重温《STL源码剖析》笔记 第五章的更多相关文章

  1. 《STL源码剖析》——第五、六:关联容器与算法

    第五章.关联容器  5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层 ...

  2. 《STL源码剖析》——第四章、序列容器

     1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...

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

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

  4. c++ stl源码剖析学习笔记(一)uninitialized_copy()函数

    template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...

  5. 《STL源码剖析》读书笔记

    转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...

  6. 通读《STL源码剖析》之后的一点读书笔记

    直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...

  7. 面试题总结(三)、《STL源码剖析》相关面试题总结

    声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...

  8. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  9. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  10. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

随机推荐

  1. 数据结构-自平衡二叉查找树(AVL)详解

    介绍: 在计算机科学中,AVL树是最先发明的自平衡二叉查找树. 在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树. 查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  2. 大多数时候是软件的Bug,但是... 有时候的确是硬件的问题!

    在我们性能最好的服务器中,有一台是从之前的64位测试项目中遗留下来的.那台机器配有皓龙250双核处理器,内存有8 GB.服役了一年之后,那种配置仍然是相当不错的.它还有贴心的升级方案可选:它的泰安Th ...

  3. 《java入门第一季》之正则表达式小案例

    案例一: 判断手机号码是否满足要求 import java.util.Scanner; /* * * 需求: * 判断手机号码是否满足要求? * * 分析: * 13436975980 * 13688 ...

  4. 《java入门第一季》之面向对象(谈谈接口)

    软件中有接口,这里的接口与硬件中的接口还是有很大区别的. 这里介绍接口不考虑JDK8的新特性(JDK8开始接口里面可以有非抽象方法了,介绍JDK8新特性可能要到整个第一季写完吧!) 还是直接进入接口的 ...

  5. linux测试noatime对文件访问时间的影响

    linux测试noatime对文件访问时间的影响 文件(如abc)有3个时间: # stat abc Access: 2015-04-16 19:30:13.665970572 +0800 Modif ...

  6. 算法精解:最小二乘法C实现

    计量经济学研究的直接目的是确定总体回归函数Yi=B1+B2Xi+ui,然而能够得到的只是来自总体的若干样本的观测值,要用样本信息建立的样本回归函数尽可能"接近"地去估计总体回归函数 ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. 第一个Polymer应用 - (2)创建你自己的元素

    原文链接: Step 2: Your own element翻译日期: 2014年7月6日翻译人员: 铁锚通过上一节的学习和实践, 您已经完成了一个基本的应用程序结构(application stru ...

  9. Linux完整备份工具 - dump, restore(现在基本不用这两个)

    dump 其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级喔!什么意思啊! 假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump ...

  10. OpenGL OpenCV根据视差图重建三维信息

    代码如下: // disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //Huan ...