【发布时间】:2020-08-12 15:13:16
【问题描述】:
我们以 unordered_set 为例。
判断两个元素是否相等的默认谓词是std::equal_to<T>(t1,t2),
这就是t1==t2。
现在让我们假设对于这个 T 类型,我已经实现了operator==(),所以并不是所有的成员变量都是这个比较的一部分,即两个不同的 T 元素 t1,t2 在比较时可以相等。
如果底层哈希表为这些 t1 和 t2 中的每一个计算不同的哈希,它甚至何时执行t1==t2 检查键的重复?如果有更多检查,它如何平均保持恒定时间?
【问题讨论】:
-
如果两个元素相等,它们的哈希值必须相等。可能有 2 个具有相同哈希但不相等的对象。使用适当的散列不可能有 2 个相等但具有不同散列的对象。
-
所以对于一个有成员变量a、b和c的对象,但是只有a和b用于相等,那么hash应该只使用a和b。如果 x 和 y 对象使用
(x.a == y.a && x.b == y.b) || (x.a == y.b && x.b == y.a)(交叉相等),那么哈希最好找出一种方法来为这两种情况提供相同的哈希。 -
@Eljay 因此,每当我覆盖 operator==() 时,我都必须为无序容器提供不同的哈希计算?
-
@ShookiMatzliah 它没有。 您负责根据您的班级逻辑实施适当的
std::hash特化。 -
如果您在需要哈希器的容器中使用您的对象,您有义务为您的类对象提供哈希器。 q.v. std::hash。除非您使用 C++ 已经提供哈希器的
std对象之一。
标签: c++ hash stl unordered-map unordered-set