我 刚刚 发现自己有点惊讶,无法简单地使用一个
std::unordered_set<std::array<int, 16> > test;
因为似乎没有针对
std::array
的std::hash
专门化。为什么会这样?还是我没有找到它?如果确实没有,下面的实现尝试是否可以简化?namespace std
{
template<typename T, size_t N>
struct hash<array<T, N> >
{
typedef array<T, N> argument_type;
typedef size_t result_type;
result_type operator()(const argument_type& a) const
{
hash<T> hasher;
result_type h = 0;
for (result_type i = 0; i < N; ++i)
{
h = h * 31 + hasher(a[i]);
}
return h;
}
};
}
我真的认为这应该是标准库的一部分。
std::string
和相关类型才拥有。如果我说这是因为C++试图使其标准数据结构达到当前技术水平所做的努力还没有完成整个工作,那么我会不会很不受欢迎?实际上,并没有任何需要模板的"hash"特化(这反过来又需要它们的模板参数具有可哈希性)。唯一需要特化的是内置类型和四个具体的字符串类。因此,我怀疑在这里已经划了一个界限。 - Steve Jessopstring
、u16string
、u32string
、wstring
(在C++11中为21.6)。我认为pair
和tuple
应该是下一个最重要的目标,其次是标准容器,再其次是任何由可哈希成员组成的聚合类型的默认哈希。 - Steve Jessopstring
哈希器需要一个内部函数来对一块内存进行哈希。我想知道为什么它们没有要求实现直接公开它? - Nemoboost::hash_combine
使用seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
,如果有人感兴趣的话。这看起来更加健壮一些。 - Rag