我有 unordered_set of vector< int > 的自定义哈希函数:

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。 但事实并非如此。

谁能解释一下我的推理有什么问题?

#1楼 票数:3

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

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

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

#2楼 票数:3 已采纳

哈希不是一切,你在这里看到的是碰撞。

两个std::vector<int>在这里具有相同的散列值,但是在计算散列之后, std::unordered_map实际上会使用operator==检查元素是否相等,在这种情况下会失败,并且无法找到该元素。

碰撞在 HashMaps 中是很正常的事情,如果不提供自定义operator== ,您在这里无能为力。

#3楼 票数:1

如果您碰巧想要唯一标识符但不自动比较值,则可以使用(unordered_)map<int, vector<int>>并使用该 VectorHash 函数生成 int 键:

unordered_map<int, vector<int>> map;

int key=V[0] + V[1]
map[key] = V;

#4楼 票数:1

如果您希望两个元素匹配,您还需要为unordered_set提供一个比较器,您可以执行以下操作:

struct VectorComparator {
  bool operator()(const std::vector<int> & obj1, const std::vector<int> & obj2) const
  {
    if ((obj1[0] + obj1[1]) == (obj2[0] + obj2[1]))
      return true;
    return false;
  }
};

并像这样创建您的unordered_set

std::unordered_set<std::vector<int>, VectorHash, VectorComparator> mySet;

那么你应该得到你期望的结果

  ask by Oleksandr Teslenko translate from so

未解决问题?本站智能推荐:

2回复

散列unordered_set的自定义指针类型

我正在尝试对Edge结构进行哈希处理,以便可以拥有具有唯一边缘的unordered_set。 在我的情况下,如果之前在集合中未遇到两个端点的组合,则该边缘被认为是唯一的。 虽然我的代码对于只包含Edge类型的unordered_set可以正常工作,但是我无法使它适用于Edge类型的指针。
2回复

检查unordered_set是否包含其他unordered_set中的所有元素-C++

我是C ++的新手,并且被要求将Java程序转换为C ++。 我正在尝试编写一种方法来检查unordered_set中的所有元素是否在另一个unordered_set中。 我发现下面的示例使用hash_set,但是不建议使用hash_set,建议立即使用unordered_set。 因此
2回复

如何使用具有对向量的元素的unordered_set

我想要有类似的东西 但即使没有配对: 它失败: http://ideone.com/wusr5V
3回复

C++:将元素从unordered_set复制到向量

背景:我正在为旅行商问题实现最近邻算法。 我需要计算巡回旅行的距离以及跟踪所访问点的顺序。 我已经定义了一个带有实例变量x和y的点类,以及一个用于计算两点之间距离的函数calcDist 。 我首先将所有点存储在std::unordered_set命名points ,创建一个空的std::v
4回复

在C++中访问unordered_set的最后一个元素

我已经用 [2,3,5] 创建了一个 unordered_set 并且我想以 FIFO 顺序访问,unordered_set 是如何实现的,尝试这样做但出现编译错误。
2回复

如何在C++中仅访问unordered_set的元素?[关闭]

例如, 我如何从s获得价值100? 从http://www.cplusplus.com/reference/unordered_set/unordered_set/begin/中 , 请注意, unordered_set对象不能保证将哪个特定元素视为其第一个元素。 但是,无论如何
1回复

std::unordered_set中元素的要求

my_type必须满足哪些要求? (除了std :: hash的专业化)
2回复

C++:为什么unordered_set::find比find快?

当我做 unordered_set::find 时 这段代码的运行时间比快 根据参考资料, unordered_set::find 是“最坏情况:容器大小呈线性”,而 find 是“第一个和最后一个之间的距离达到线性:比较元素直到找到匹配项” 。 它们不是相同的运行时吗? 为什么在运行代码时 uno