C++学习24:容器深度探索之Hashtable(哈希表)源码剖析

关联容器:非常有用,元素的查找和插入都是非常快的,可以看作一个小型数据库。
对于不定序容器,即unordered,哈希表提供了底层的实现。

1 哈希表

当容器容量大于数据数量时,则可以做到一个数据占据一个位置。而对于大量数据来说,这种情况时过于理想、不存在的。故应该考虑一种容器容量小于数据数量时的处理,通过“折射"(取余)的方式放入容器,那就是哈希表。
在这里插入图片描述
可以想象,这种操作一定会发生“碰撞”。当发生碰撞时,应该有处理他们的办法。

2 哈希表的构建

当发生碰撞时,当前的方法是Saparate Chaining,即在buskets vector里串出一根链表,在碰撞处东西较少时,搜索速度依然很快。但链表过长时,要进行"打散"处理:当链表数量比busket数量多时,就进行打散,将busket扩大大约2倍,重新进行排列,即Rehash
在这里插入图片描述

3 哈希表的实现

模板参数:BashFcn是哈希表的“编号”,即定义了一个对象怎样得到他的编号;ExtractKey为如何从一个类的数据中取出其有用的数据,如pair中取到第二个值;EqualKey为比大小的方式。
private中的数据:3个前面所述模板参数创建出的对象;busket是那个vector;num_element为当前数据的数量。
迭代器需要有能力找到下一个busket,类似deque的控制中心一样,进入下一个busket。cur应该指向一个节点(下图是错误的),如果一个busket走到了尽头,需要用ht进入下一个busket。
在这里插入图片描述

4 哈希表的用例

在这里插入图片描述
其中对于hash,就是得到其标号。标准库的操作方式为,如果是整数,就使用这个数作为标号,如果是字符型,就用一种特殊的标号方式得到其标号。
在这里插入图片描述
在这里插入图片描述
得到标号后,将这个标号放进那个busket里面。我们可以通过下面代码看出,最重要的操作是取余操作:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值