- 论坛徽章:
- 0
|
template<typename T,
typename HashFunction = hash<T>,
typename CompareFunction = equa_to<T>,
typename Allocator = allocator<T> >
class hash_set;
SGI设计的一个值得注意的方面是使用equal_to作为默认比较函数。这违背标准关联容器的约定——默认比较
函数是less。这个设计结果不仅仅表示简单地改变默认比较函数。SGI的散列容器确定在一个散列容器中的两
个对象是否有相同的值是通过相等测试,而不是等价(参见条款19)。对于散列容器来说,这不是一个不合
理的决定,因为散列关联容器,不像它们在标准中的(通常基于树)兄弟,不需要保持有序。
Dinkumware设计的散列容器采取一些不同的策略。它仍然允许你指定对象类型、散列函数类型、比较函数类
型和分配器类型,但是它把默认的散列和比较函数移进一个单独的类似特性的叫做hash_compare的类,而且
它把hash_compare作为容器模板的HashingInfo实参的默认值。(如果你不熟悉“特性”类的概念,打开一本
好的STL参考,比如Josuttis的《C++ Standard Library》[3]并学习char_traits和iterator_traits模板的动机和实
现。)
例如,这是Dinkumware的hash_set声明(再次为演示而调整过):
template<typename T, typename CompareFunction>
class hash_compare;
template<typename T,
typename HashingInfo = hash_compare<T, less<T> >
typename Allocator = allocator<T> >
class hash_set;
这种接口设计有趣的地方是HashingInfo的使用。容器的散列和比较函数储存在那里,但HashingInfo类型也容
纳了控制表中桶(bucket)最小数量,以及容器元素对桶的最大允许比率的枚举。当这比率被超过时,表中
桶的数量就增加,而表中的一些元素需要重新散列。(SGI提供具有类似控制表中桶和表中元素对桶比率的
成员函数。)(译注:如果你不知道桶和散列表的原理,那么看看数据结构的书中关于散列表的部分。)
做了一些为了演示的调整之后,hash_compare(HashingInfo的默认值)看起来或多或少像这样:
template<typename T, typename CompareFunction = less<T> >
class hash_compare {
public: |
|