重读STL源码剖析:hashtable

hashtable:

hashtable的设计是一个vector数组,每一个数组内为一个链表,链表链着hash到同位置的节点,但链表的实现不是list或slist数组

hashtable的节点设计:设计

1.存储元素值的变量val指针

2.一个指向下一个节点(同一个bucket内的)的指针nextelement

hashtable的迭代器:hash

1.内部维护两个成员:it

指向当前节点的curtable

指向所属bucket的指针基础

2.迭代器属于forward_iterator,只能++与读写,这是由链表的特性决定的。变量

hashtable的结构:map

1.一个vector数组buckets,用于存放节点

2.num_elements用于统计全部节点的个数(不是指vector的大小)

插入与表格重整:

插入:

当插入时,首先经过一个resize(num_elements)用于判断是否须要重建表格,若是须要就扩充。而后进行插入

表格重整:

判断表格是否须要重整是经过判断num_elements是否大于buckets.size()

也就是说若是节点个数大于vector的size,则重整表格。

重整的表格大小为大于当前表格大小的一个质数,关系上来看接近于两倍。

表格大小调整完后,对原buckets里的每一个节点进行重哈希(由于表格大小变了),从新构造。

 

hash_set:

底层以hashtable为基础,插入使用insert_unique

hash_map:

底层以hashtable为基础,插入使用insert_unique

hash_multiset:

底层以hashtable为基础,插入使用insert_equal

hash_multimap:

底层以hashtable为基础,插入使用insert_equal

相关文章
相关标签/搜索