C ++ 11:有没有理由为什么一些常规类型不应该有`std :: hash`专用?

时间:2015-04-30 13:40:04

标签: c++ hash regular-type stdhash

使用常规类型,我的意思是编程元素中Stepanov的定义,基本上,存在相等的概念,并且彼此副本的对象相等。

所以当你有一个常规类型T,并且相等关系是可传递的( a == b&& b == c => a == c ) ,你可以定义一个(非平凡的)哈希函数,它与相等的定义一致( a == b => h(a)== h(b))。总是

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

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

或者,提出不同的问题:是否有理由不为您自己的类型提供std::hash专业化,只要它们是常规的且平等是可传递的?

2 个答案:

答案 0 :(得分:2)

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

  • 没有一种有效的方法可以始终如一地创建质量哈希,涵盖所有用于描述相等的数据。

  • 没有有效和/或直观的方法来选择要哈希的一致数据子集。

答案 1 :(得分: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>相反。