看起来很直观,人们应该能够使用集合,而且std::set
的设计默认是支持这种使用(因为默认情况下会执行词典排序。)同样,期望boost::unordered_set
的相同功能。有没有一个很好的理由为什么在默认情况下boost不会为boost::unordered_set
实现广义哈希函数,例如:
// DEFINE A HASH FUNCTION FOR A HASH-SET THAT COMBINES THE HASH VALUES
// OF THE ELEMENTS OF THAT SET
namespace boost {
template<typename T>
size_t hash_value(const boost::unordered_set<T> & set) {
typename boost::unordered_set<T>::const_iterator it, itend;
size_t seed = 0;
for ( it = set.begin(), itend = set.end(); it != itend; it++ ){
boost::hash_combine(seed,boost::hash_value(*it));
}
return seed;
}
}
答案 0 :(得分:2)
一般来说,你希望哈希是快速的,理想情况下是恒定时间。
在string
上,你可以做的一件事是得到长度,然后只在其长度上采样X次(假设非病理输入,将相当好地避免碰撞)。
unordered_set
缺少get_nth
,这将允许类似的策略将散列时间保持在O(1)。或者,unordered_set
可以保留其内容的散列的xor并将其用作自己的散列(而不是hash_combine,因为它依赖于顺序,并且当有100时,很难从组合散列中删除第3个元素他们在O(1)时间。)
缺乏良好的O(1)实现,默认情况下公开hash_value
对于unordered_set<unordered_set<foo>>
的构建者来说似乎过于鼓励,实际上他们应该写unordered_set< my_unordered_set_wrapper<foo> >
,其中unordered_set_wrapper
1}}做上面的“xor of contents hashs”来产生O(1)hash_value
。要么是,要么扩展unordered_set
。
至于为什么boost
实际没有包含它,你必须要求所有向boost
集体添加内容的人。它们似乎不存在。