[英]Understand the usage of `std::unordered_set`
#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> unordered_set
使用MN::operator==
檢查新項目是否重復?
問題2> unordered_set
使用'MNHash'計算新項目的哈希鍵是否正確?
問題3>如果對Q1和Q2的回答都是“是”,那么因為MN(2,3)和MN(3,2)具有相同的哈希碼,我們是否會在about代碼中看到哈希沖突?
謝謝
或多或少。 std::unordered_set
的默認比較器將使用std::equal_to
,除非專門指定,否則將return lhs == rhs
。
您可以通過專用於std::equal_to
或通過向std::unordered_set
添加第三個模板參數來更改此設置。
它將使用第二個模板參數來計算哈希值。 在這種情況下,您已經傳遞了MNHash
,因此它將使用它來完成工作。
由於MN(2,3)
和MN(3,2)
的哈希值相同,因此它們將放置在同一存儲桶中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.