C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

hashtable

object可以折射成一个数值,放在一个容器里面。相当于一个号码,需要多少空间才行?如下图所示:

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

空间足够直接分配,空间不足将空间压缩:H%M,比如将第100个为止放到容器H%100的位置。这种方法容易数据碰撞。碰撞的话就变成一条链表串在一起。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

但是链表过长搜寻的时间复杂度很高,所以如果发现链表过长需要打散。把篮子扩增为两倍(附近,不是一定是两倍)。53个篮子变成97个。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

指定6个模版参数:value/key/hashfunction:把函数对象变成编号/Extractkey:从一包东西取出key/Equalkey:key相等,怎么比大小/alloc:分配器预设值。

hashtable的sizeof:绿色数据大小都是0,实际上都是1-》3+buket12个字节 + num_elements 4个字节 = 19字节,调整为20字节。

图中cur指向vector中的节点。

Test

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

C ++标准库使用,包含六个参数。value/key/hashfunction:把函数对象变成编号/Extractkey:从一包东西取出key/Equalkey:key相等,怎么比大小/alloc:分配器预设值。跟hashtable一样的。注意eqstr传回来的是-1/0/1不是bool类型。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

上图是模版偏特化,hash指明不同功能则调用不同便特化。传递x进去,返回x。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

如果代表的是char*,如上图所示。hashtable需要散列,所以求h很复杂。如上图灰色部分所示。

在电脑里面处理很多数据类型,所以需要针对个别类型,设计不同的hash_function。

modulus运算

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

左边是参数运算,右边是参数返回。hash(key)%n决定你落在哪个篮子上。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

具体用例:

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

这里没有具体讲。

 HashSet:

  HashSet实现了Set接口,它不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在

HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有

储存相同的对象。如果不重写上述两个方法,那么将使用下面方法默认实现:

 public boolean add(Object obj)方法用在Set添加元素时,如果元素值重复时返回 "false",如果添加成功则返回"true"

HashMap:

  HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现

TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能。HashMap可以有空的键值对(Key(null)-Value(null))

HashMap是非线程安全的(非Synchronize),要想实现线程安全,那么需要调用collections类的静态方法synchronizeMap()实现。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

unordered

不定序容器,使用上跟hash一样

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered

最重要的是倒数第二行(768行),将字符串分配到篮子上。

C++ STL 体系结构与内核分析(四)STL六大部件-关联式容器hashtable/hash_set/unordered