C ++标准是否为unordered_set定义了存储桶的结构?

时间:2016-11-06 21:04:35

标签: c++ unordered-set hash-function

当计算unordered_set中元素的哈希值时,它与其他 - 不同 - 元素一起放在“桶”中,但是相同的哈希值。

我的经验是这样一个桶中的元素存储在单链表中。这意味着,在具有错误哈希函数的存储桶中搜索时,它会非常慢。

单链表是标准要求还是仅仅是一种可能的实施方式?可以用unordered_set作为存储区来实现set吗?

1 个答案:

答案 0 :(得分:3)

标准规定了要求和保证,但未明确强制使用基础数据结构和算法。

  

N4140§23.2.5[unord.req] / 1

     

无序关联容器提供快速检索的能力   基于密钥的数据。大多数操作的最坏情况是   线性,但平均情况要快得多。

这有点奇怪,因为它将最坏情况的复杂性说成是一个事实,而不仅仅是允许它。

  

N4140§23.2.5[unord.req] / 9

     

无序关联容器的元素被组织成   水桶。具有相同哈希码的密钥出现在同一个存储桶中。随着元素的添加,桶的数量会自动增加   一个无序的关联容器,这样的平均数   每桶的元素保持在一个边界之下。 重复无效   迭代器,更改元素之间的顺序以及更改   存储桶元素,但不会使指针无效或   对元素的引用

以上似乎使std::set无效为可能的数据类型,但如果它允许在其实例之间移动元素而不会使指针或引用无效,则应允许set类数据结构。

这留下了一个障碍:set s需要定义比较器/ operator<(具有严格的弱排序语义),而无序的关联容器不需要这样的要求。在这种情况下,如果未定义链接列表,则可以简单地回退到链接列表。

因此,据我所知,如果符合上述条件,您可以用类似集合的结构替换链表。话虽这么说,如果你使用了正确的散列算法,它确实感觉你不应该首先体验到这个问题。