编译器对关联容器的实现有两个版本,上一节总结了以红黑树做为基础的实现版本,这一节总结以哈希表(hash table,散列表)为底部结构的实现版本。

一、Hashtable简单介绍

  Hashtable相比红黑树版本来说简单的多,但是内存占用来说大于红黑树,Hashtable把每一个要放入的元素折射成一个数值,在内存完全足够的情况下,需要的空间大小是sizeof(元素)*2的32次方,也就是说每个元素都要有4g*当前元素大小的空间,当放入元素时元素编号是多少就放入对应编号的位置,但实际上内存不可能有这么充足,所以我们就会面临一个问题,元素多空间少,此时我们放入时就要拿当前元素编号除以空间大小得到余数,元素就放到余数对应的编号位置,接下来会带来一个问题,发生碰撞(多个元素要放入的位置相同),这个时候早期设计者就会再次设计一系列的算法,遵循先来后到的原则,后到的经过算法挪到别的位置上去,有碰撞就再次设计新的算法再强制分开

  由于Hashtable的设计理念就是要快速的查找和搜寻,现在确把大量的时间花在处理碰撞的情况上,显然效率太低下,所以后来新做法:把需要碰撞处理的元素直接让它像链表一样串起来(separate chaining分离链表法)

  注意:为了防止其中某一个链表过长,就需要在合适时间打散所有元素重新排列,我们把初始的hashtable空间叫做篮子(bucket),当我们放入的元素个数大于篮子个数时(gunc初始篮子个数为53),就要扩充篮子个数,扩充数量为当前篮子个数2倍附近的一个质数(比如:53扩充到97),然后将所有元素重新从头开始放入新篮子。

二、unordered(不定序)容器

  unordered containered容器在c++11引入,由之前得hash过渡过来

2.1 unordered_set 使用示例

C++标准库分析总结(七)——<Hashtable、Hash_set、Hash_multiset、unordered容器设计原则>的更多相关文章

  1. C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

    本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征 1.Deque基本结构 Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的 ...

  2. C++标准库分析总结(四)——<Vector、Array、Forward_list设计原则>

    本节主要总结标准库Vector和Array的设计方法和特性以及相关迭代器内部特征 1.Vector 1.1 Vector 内部实现 Vector是自增长的数组,其实在标准库中没有任何一种容器能原地扩充 ...

  3. C++标准库分析总结(三)——<迭代器设计原则>

    本节主要总结迭代器的设计原则,以及iterstor traits的设计作用 1.迭代器遵循的原则 迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用 ...

  4. C++标准库分析总结(一)

    之前学习过标准库,最近身边有人问到相关话题,故在此做一个总结 1 标准库介绍 C++标准库:C++ Standard Library C++标准模板库:Standard Template Librar ...

  5. golang标准库分析之net/rpc

    net/rpc是golang提供的一个实现rpc的标准库.

  6. C++标准库分析总结(八)——<仿函数、适配器、istream_iterator、ostream_iterator、bind>

    一.仿函数定义 仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用.仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以 ...

  7. C++标准库分析总结(九)——<HashFunction、Tuple>

    一.HashFunction 当我们在使用hash table以及由它做底层的数据结构时,我们必不可少要讨论hash function,所谓的哈希函数就是产生一个数,这个数越乱越好,以至于达到避免碰撞 ...

  8. C++标准库分析总结(六)——<Map、Multimap、Set、Multiset设计原则>

    关联容器我们可以看做是一个小型的数据库,它就是用key找value,编译器底层对于关联容器的实现有两种:红黑树(Red-Block tree)和哈希表(hash table,散列表). 一.红黑树简单 ...

  9. C++标准库分析总结(二)——<模板,分配器,List>

    本节主要总结模板及其类模板分类以及STL里面的分配器.容器内部结构以及容器之间的关系和分类,还介绍了容器中List的结构分布 1.源代码版本介绍 1.1 VC的编译器源码目录: 2.类模板 2.1 类 ...

随机推荐

  1. 🕯国家公祭日-默哀javascript脚本

    国行公祭,祀我国殇 兽行暴虐,共御外侮 昭昭前事,惕惕后人 永失弗谖,祈愿和平 var national_memorial_days=['12-13']; var dateObj=new Date() ...

  2. 无重复字符串的最长子串 python

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  3. css 层叠 比较特殊性

    css 层叠: 多个相同的css声明(属性),应用到同一个元素上.当一个标签声明冲突时,浏览器会自动出发层叠机制 1:比较优先级 2:比较特殊性 3:比较源次序 依次经过上面的1,2,3的比较后,最终 ...

  4. vue使用阿里矢量图标

    官方注册注册 1.加入购物车 在阿里矢量图标库将想要的图标加入购物车,然后在购物车中将图标添加到项目:     2.下载 到我的项目中,将图标下载到本地     3.解压引入 在vue项目的asset ...

  5. oracle trunc函数用法

    转自:https://www.e-learn.cn/content/qita/699481 /**************日期********************/ select trunc(sy ...

  6. Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game

    Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game 对于博弈论的题目没接触过多少,而这道又是比较经典的SG博弈,所以就只能自己来推关系-- 假设我们有两个数$m,n$ ...

  7. git如何利用分支进行多人开发

    在使用git时,假如远程仓库有 dev 和 master 两个分支,master 作为一个稳定版分支,可用于直接发布产品,日常的开发则 push 到 dev 分支,那本地是不是要从 dev 分支中创建 ...

  8. keil mdk 菜单 “project” 崩溃问题解决

    今天发现我的 Keil MDK5.28z win10系统上面,点击 Project 菜单立即崩溃.网上找到了解决方法 简单粗暴的处理方法:重装keil ,但是依然点击 project 崩溃. 通过搜索 ...

  9. mac XXX 已损坏,打不开。 您应该将它移到废纸篓。

    mac 上的软件我改了某些配置,打开提示这个. 是因为安全认证问题. 在系统偏好设置里面,安全与隐私设置为允许任何来源就可以. 如果新版系统没有这个选项,那么在命令行输入:sudo spctl --m ...

  10. 源码安装部署redis

    下载redis源码包 解压 编译安装 ./configure PREFIX=/data/apps/rediscd /data/apps/redismake && make instal ...