[ C++ ] | unordered_map 底层实现原理
目录
unordered_map
解决哈希冲突的方式
STL中哈希表是什么样的?
unordered_map是怎么封装哈希表的
unordered_map
unordered_map, 是基于散列表(哈希表), 将KV对, 通过对K进行hash运算, 映射到hash表的具体位置.
将多个Key映射到hash表中的同一个位置的行为, 叫做哈希碰撞.
解决哈希冲突的方式
线性探查, 开放寻址, 拉链法等, C++STL, Redis, 中使用的是拉链法, 所以这个主要说说拉链法.
拉链法就是多个Key映射到同一个位置的时候, 将多个元素使用链表头插的方式插入进去.
1).
2).
我们使用负载因子来表示哈希碰撞的激烈程度, (实际存储的元素个数 / 散列表中桶的个数), 当负载因子大于1的时候, 触发rehash, 散列表扩容, 将原来映射的KV对, 重新映射到扩容后的散列表上.
rehash的时候, 会对通过hash函数之后值缓存起来, 再对新散列表的大小取余 ...
STL中哈希表是什么样的?
用一个_M_before_begin, 让所有的存储数据的节点都链在这个节点之后
每一个数组槽位, 每一个桶, 都指向该层节点的上一个节点
在插入的时候, 提供的是 index, Value, Value包括key和value, 判断桶子里面是否有元素, 有元素的话: 头插到上一个节点之后. 没有元素的话: 头插到_before_begin之后, 修改曾经指向_before_begin节点的桶子的指向