簡體   English   中英

了解`std :: unordered_set`的用法

[英]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代碼中看到哈希沖突?

謝謝

  1. 或多或少。 std::unordered_set的默認比較器將使用std::equal_to ,除非專門指定,否則將return lhs == rhs

    您可以通過專用於std::equal_to或通過向std::unordered_set添加第三個模板參數來更改此設置。

  2. 它將使用第二個模板參數來計算哈希值。 在這種情況下,您已經傳遞了MNHash ,因此它將使用它來完成工作。

  3. 由於MN(2,3)MN(3,2)的哈希值相同,因此它們將放置在同一存儲桶中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM