使用常规类型,我的意思是编程元素中Stepanov的定义,基本上,存在相等的概念,并且彼此副本的对象相等。
所以当你有一个常规类型T
,并且相等关系是可传递的( a == b&& b == c => a == c ) ,你可以定义一个(非平凡的)哈希函数,它与相等的定义一致( a == b => h(a)== h(b))。总是
但该标准不包括许多std::hash
专业化。例如。 std::complex
没有容器,也没有容器,vector<bool>
和bitset
除外。
所以我想知道这里的设计原理是什么。
或者,提出不同的问题:是否有理由不为您自己的类型提供std::hash
专业化,只要它们是常规的且平等是可传递的?
答案 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>
相反。