C++ unordered_map实现方案,与hash冲突解决办法

本文详细介绍了 C++ 中 unordered_map 的实现原理,包括其内部采用的 hashtable 数据结构,哈希冲突的解决方式——开链法,以及负载因子的概念和扩容规则。此外,还讨论了哈希函数的设计及其常见的实现方法,如直接地址法和除留余数法,并分析了这些方法可能导致的哈希冲突问题。
摘要由CSDN通过智能技术生成

unordered_map有点类似c++11之前的非标准库hash_map, c++11后, 加入了unordered_map, 可就用来代替之前的hash_map。
由于 unordered_map 内部采用 hashtable 的数据结构存储,所以,每个特定的 key 会通过一些特定的哈希运算映射到一个特定的位置,我们知道,hashtable 是可能存在冲突的,在同一个位置的元素会按顺序链在后面(也称之为开链法)。所以把这个位置称为一个 bucket 是十分形象的,每个哈希桶中可能没有元素,也可能有多个元素。
今天来看看unordered_map的底层实现。先上个图:
在这里插入图片描述
从图中不难看出, 首先需要开辟一段连续内存用来存储每个桶的头地址,各键值对真正的存储位置是各个链表的节点。当插入元素节点越来越多的时候, 就会超过存储桶位置序列的个数。 这时就需要扩容。扩容规则跟vector有点类似。 另外值得一提的是,哈希表存储结构还有一个重要的属性,称为负载因子(load factor)。该属性同样适用于无序容器,用于衡量容器存储键值对的空/满程序,即负载因子越大,意味着容器越满,即各链表中挂载着越多的键值对,这无疑会降低容器查找目标键值对的效率;反之,负载因子越小,容器肯定越空,但并不一定各个链表中挂载的键值对就越少。
举个例子,如果设计的哈希函数不合理,使得各个键值对的键带入该函数得到的哈希值始终相同(所有键值对始终存储在同一链表上ÿ

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值