hashtable学习

本文解释了unordered_map中的h1和h2的作用,以及unordered_xxx容器在hashtable中的key-value存储和桶的设计。还介绍了hashtable的底层算法、桶扩容机制和rehash触发条件。
摘要由CSDN通过智能技术生成
template<typename _Key, typename _Value, typename _Alloc,
typename _ExtractKey, typename _Equal,
typename _H1, typename _H2, typename _Hash,
typename _RehashPolicy, typename _Traits>

hash模板参数

1.unordered_xxx容器的h1、h2分别是什么?分别在什么场景下使用,在代码当中是如何使用的?起了什么作用?

unordered_map中有h1,h2,hash三个,会根据是否选择hash_code来决定使用

选择hash_code时,h1计算出hash_code,再用h2计算出桶的索引,从而确定出该元素存放在哪个桶。其中h1就是默认的hash函数,h2是(hash_code+bucket_size)%bucket_size;

而不选择hash_code时,直接采用hash函数计算出桶索引即可。

2.unordered_xxx在hashtable中存储的key、value分别是什么?

key就是key,value是存放的pair<const key,value> 是一个pair

3.hashtable的_Hash_node里面存储的是什么?key?value?还是?

_Hash_node有两个:

  • 存储hashcode(size_t)
  • 不存储hashcode
+-----------------------------------+
|         _Hash_node_base            |
+-----------------------------------+
| - next: _Hash_node*                |
+-----------------------------------+
​
              ^
              |
              |
​
+-----------------------------------+
|         _Hash_node_value_base     |
+-----------------------------------+
| - _M_storage: __aligned_buffer<_Value> |
+-----------------------------------+
| + _M_valptr(): _Value*             |
| + _M_valptr() const: const _Value* |
| + _M_v(): _Value&                  |
| + _M_v() const: const _Value&      |
+-----------------------------------+
​
              ^
              |
              |
 
+--------------------------------+
|          _Hash_node            |
+--------------------------------+
| - _M_hash_code:  std::size_t   |
+--------------------------------+
​

4.hashtable的底层算法逻辑是?桶?怎么设计?

vector的每一个元素是一个桶,桶中延申出去一条链表

5.桶的扩容机制是什么?

(当前元素个数+插入元素个数)/桶数量>负载因子,则需要发生扩容,扩容到下一个质数

6.rehash是干什么用的,什么场景下触发?

rehash就是当哈希冲突达到一定程度时触发,(当前元素个数+插入元素个数)/桶数量>负载因子,rehash后将key重新落位到桶中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值