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重新落位到桶中