条目二十五《熟悉非标准的散列容器》
条目二十五《熟悉非标准的散列容器》
STL标准不没有标准的散列容器,不过我们可以使用开源的,作为STL库中非标准存在的,即将加入标准库的hast_map,hash_set。
它们在不同的厂商有不同的实现,比较常用的版本有:
- 1.SGI
- 2.Dinkumware
二者都是基于开放式散列策略。
前者是一个单向链表结构,只有前向迭代器。
而后者是基于一种新的数据结构,由指向元素的双向链表的迭代器数组(本质上也是桶)组成,相邻的一对迭代器标识了每个桶中的元素的范围。(貌似内存管理的二级内存分配器也是这种结构吧)
对于SGI需要注意的:
SGI的散列容器通过测试两个对象是否相等,而不是是否等价来决定容器中的两个对象是否有相同的值。因为底层是数组(数组比较常见,也有链表的)嘛,数组的下标是int型。
它的定义是下图:
所以如果想自己控制散列容器,可以自定义一个类继承它,然后重写比较子,hash函数,分配子alloctor。
SGI通过成员函数来实现控制hash功能,通过它们可以控制散列桶的个数,也就控制了表中元素个数与桶个数的比率。
对于Dinkumware需要注意的:
指定对象类型、散列函数类型、比较函数类型和分配子类型,但是它把默认的散列函数和比较函数放在一个单独的类似于traits(特性)的hash_compare类中,并把hash_compare作为容器模板的HashingInfo参数的默认实参。
它的定义如下图:
HashingInfo同时包含一些控制桶数目和最大rehash临界点的阈值。容器中元素个数与桶个数的最大允许比率(当超过这个比率时,散列表的桶数目将增加,表中的某些元素要被重新做散列计算)。