#include <iostream>
#include <cmath>
#include <unordered_set>
using namespace std;
struct MN
{
MN(const int& _m, const int& _n)
: m(_m), n(_n) {
value = pow (m, n);
}
bool operator==(const MN& rhs) const {
return m == rhs.m && n == rhs.n;
}
int value;
int m;
int n;
};
struct MNHash
{
size_t operator()(const MN& rhs) const {
return hash<int>()(rhs.m) ^ hash<int>()(rhs.n);
}
};
int main() {
unordered_set<MN, MNHash> st;
st.emplace(2, 3);
st.emplace(3, 2);
cout << st.size() << endl; // 2
return 0;
}
问题1&gt; unordered_set
使用MN::operator==
检查新项目是否重复是否属实?
问题2&gt; unordered_set
使用&#39; MNHash&#39;是真的吗?计算新项的哈希键?
问题3&gt;如果Q1和Q2的答案都是YES,那么我们是否会在代码中看到哈希冲突,因为MN(2,3)和MN(3,2)都具有相同的哈希码?
谢谢
答案 0 :(得分:2)
或多或少。 std::unordered_set
的默认比较器将使用std::equal_to
,除非专业,否则将return lhs == rhs
。
您可以通过专门设置std::equal_to
或向std::unordered_set
添加第三个模板参数来更改此设置。
它将使用第二个模板参数来计算哈希值。在这种情况下,您已通过MNHash
,因此会使用它来完成工作。
由于MN(2,3)
和MN(3,2)
的哈希值相同,因此它们将放在同一个存储桶中。