c ++找不到具有相同散列的无序集

问题描述 投票:0回答:2

我具有用于向量的unordered_set的自定义哈希函数

struct VectorHash {
int operator()(const vector<int> &V) const {
    int hsh=V[0] + V[1];
    return  hash<int>()(hsh);
}};

并且对于两个这样的向量,我具有相同的哈希等于3:

vector<int> v1{2,1};
vector<int> v2{1,2};

但是当我尝试在unordered_set中插入第一个向量v1,然后检查我的unordered_set中是否通过散列与v2具有相同的向量时,我得到了假:

std::unordered_set<std::vector<int>, VectorHash> mySet;
mySet.insert(v1); 

if(mySet.find(v2) == mySet.end())
    cout << "didn't find" << endl;

Output:  "didn't find"

[我假设如果unordered_set中的两个元素具有相同的哈希,那么如果我的unordered_set中具有v1,则当我尝试查找v2时,find方法应该返回true。事实并非如此。

任何人都可以向我解释我的推理有什么问题吗?

c++ unordered-set
2个回答
2
投票

[我假设如果unordered_set中的两个元素具有相同的哈希,那么如果我的unordered_set中具有v1,则当我尝试查找v2时,find方法应该返回true。

这种假设是不正确的,相同的哈希并不意味着对象相等。

unordered_map使用相等谓词确定对象相等(默认为std::equal_to)。


2
投票

哈希不是全部,您在这里看到的是碰撞。

std::vector<int>在这里都具有相同的哈希值,但是在计算完哈希后,std::unordered_map实际上会使用operator==检查元素是否相等,实际上检查元素是否相等,这种情况下将失败,并且找到元素。

冲突是HashMaps中的正常现象,在没有提供自定义operator==的情况下,您在这里可以做的很多。

© www.soinside.com 2019 - 2024. All rights reserved.