【发布时间】:2011-11-06 13:41:44
【问题描述】:
我just 发现自己无法简单地使用 a 有点惊讶
std::unordered_set<std::array<int, 16> > test;
因为似乎没有std::hash 专门用于std::arrays。这是为什么?还是我根本没找到?如果确实没有,是否可以简化以下实现尝试?
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特化(这反过来又要求它们的模板参数是可散列的)。唯一需要的特化是内置类型和四个具体字符串类。所以我怀疑那里画了一条线。 -
string、u16string、u32string、wstring(在 C++11 中为 21.6)。我想说pair和tuple应该是次高优先级目标,然后是标准容器,然后是由可散列成员组成的任何聚合类型的默认散列。 -
显然
string散列器需要一个内部函数来散列内存块。我想知道为什么他们不需要实现直接公开它? -
@FredOverflow:我会查找
boost::hash_combine的代码,是否要在集合上实现散列。 -
@nemo 没有人把它写成给委员会的论文。只有当有人足够关心以实现它时,事情才会进入标准。
标签: c++ arrays c++11 hash-function unordered-set