16

对于常规类型,我的意思是在Elements of Programming中对 Stepanov 的定义,基本上,有相等的概念,并且作为彼此副本的对象比较相等。

所以当你有一个 Regular Type T,并且等式关系是传递的(a == b && b == c => a == c),你可以定义一个(非平凡的)散列函数,它与定义一致平等(a == b => h(a) == h(b))。总是。

但该标准不包括许多std::hash专业。例如std::complex,没有容器,容器也没有,除了vector<bool>bitset

所以我想知道这里的设计原则是什么。

或者,换种方式问:是否有理由不std::hash为您自己的类型提供专业化,只要它们是常规的并且相等是可传递的?

4

2 回答 2

2

是的。

当一个类型具有以下两个属性时,我认为您不应该定义std::hash

  • 没有有效的方法来始终如一地创建覆盖用于描述相等性的所有数据的高质量哈希。

  • 没有有效和/或直观的方法来选择一致的数据子集进行散列。

于 2015-04-30T14:13:25.080 回答
0

如果它们是模板类,则为自己的类型提供专门化是没有意义的,因为散列函数(很有可能)还取决于模板参数的类型,而这些类型是未知的。

如果没有模板参数,或者模板参数仅限于某些类型

// provide no implementation to restrict all types
template<typename T> container;

// int is allowed
template<> container<int> {
    ...
}

// double is allowed
template<> container<double> {
    ...
}

提供特殊化std::hash是可能的,因为类(或实例化模板类)的实现是已知的,因为它vector<bool>complex<T>.

于 2015-04-30T14:08:58.570 回答