当计算unordered_set
中元素的哈希值时,它与其他 - 不同 - 元素一起放在“桶”中,但是相同的哈希值。
我的经验是这样一个桶中的元素存储在单链表中。这意味着,在具有错误哈希函数的存储桶中搜索时,它会非常慢。
单链表是标准要求还是仅仅是一种可能的实施方式?可以用unordered_set
作为存储区来实现set
吗?
答案 0 :(得分:3)
标准规定了要求和保证,但未明确强制使用基础数据结构和算法。
N4140§23.2.5[unord.req] / 1
无序关联容器提供快速检索的能力 基于密钥的数据。大多数操作的最坏情况是 线性,但平均情况要快得多。
这有点奇怪,因为它将最坏情况的复杂性说成是一个事实,而不仅仅是允许它。
N4140§23.2.5[unord.req] / 9
无序关联容器的元素被组织成 水桶。具有相同哈希码的密钥出现在同一个存储桶中。随着元素的添加,桶的数量会自动增加 一个无序的关联容器,这样的平均数 每桶的元素保持在一个边界之下。 重复无效 迭代器,更改元素之间的顺序以及更改 存储桶元素,但不会使指针无效或 对元素的引用。
以上似乎使std::set
无效为可能的数据类型,但如果它允许在其实例之间移动元素而不会使指针或引用无效,则应允许set
类数据结构。
这留下了一个障碍:set
s需要定义比较器/ operator<
(具有严格的弱排序语义),而无序的关联容器不需要这样的要求。在这种情况下,如果未定义链接列表,则可以简单地回退到链接列表。
因此,据我所知,如果符合上述条件,您可以用类似集合的结构替换链表。话虽这么说,如果你使用了正确的散列算法,它确实感觉你不应该首先体验到这个问题。