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