理解`std :: unordered_set`的用法

时间:2014-06-28 13:01:15

标签: c++ c++11

#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)都具有相同的哈希码?

谢谢

1 个答案:

答案 0 :(得分:2)

  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)的哈希值相同,因此它们将放在同一个存储桶中。