如果使用自定义类类型作为键,C++ unordered_set 的计数和查找将不起作用

标签 c++ hash unordered-set

我在将 unordered_set 与我的专用哈希函数一起使用时遇到了一些问题。 我可以毫无问题地插入元素,但是当我尝试使用 find 或 count 查找其他元素时,它不起作用。它找不到集合中已有的元素。

这是我的哈希函数:

template <class T>
inline void hash_combine(std::size_t& seed, const T& v)
{
    std::hash<T> hasher;
    seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}

namespace std {
template<> 
    struct hash<Node>
    {
        std::size_t operator()(const Node &node) const
        {
            size_t seed = 0;
            hash_combine(seed, node.getX());
            hash_combine(seed, node.getY());
            return seed;
        }
    };
}

我的节点类有很多其他成员变量,但我只组合了 X 和 Y。这应该足够了,因为我可以安全地假设不可能有 2 个节点具有相同的 X 和 Y 值。这是我第一次接触模板特化,我做错了什么吗?我想我可能没有正确散列它们。

这里有一个例子可以进一步阐明我的问题:

假设我有一个名为 mySet 的集合,其中包含 4 个节点 (X Y):<1 7> <2 7> <3 7> <1 8>/p>

bool find1(Node *node)
{   
    unordered_set<Node*>::const_iterator it = mySet.find(node);
    return (it != mySet.end()); //will be false
}

bool find2(Node *node)
{
    return !mySet.count(node); //will be 1 (!0)
}

cout << find1(新节点(1,7)) << endl;//返回 0

cout << find2(新节点(1,7)) << endl;//返回 1

有人知道为什么元素查找不起作用吗?

谢谢

最佳答案

因为您的 unordered_set 包含 Node* 而不是 Node,所以正在搜索指针而不是对象本身。我不知道为什么 find2 会返回 1,除非碰巧你有 2 个对象分配到同一个地方。

如果您尝试使用采用 Node* 的哈希函数,它也不会工作,因为 unordered_set 还需要一个有效的 == 运算符来比较元素。

关于如果使用自定义类类型作为键,C++ unordered_set 的计数和查找将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26750133/

相关文章:

c++ - 为什么在 std::unordered_set 中插入会调用复制构造函数?

C++ 多线程

c++ - 链表类

hash - 如何从整数向量生成唯一的哈希键?

ruby - 将哈希合并到哈希子类 - 确保嵌套哈希具有子类属性

c++ - 通过 unordered_set 重复迭代是否会产生一致的结果?

c++ - Hackerrank中的错误比较三元组代码

c++ - 在模板上使用模板别名

ruby - 如何使用动态键对 Ruby Hash 进行排序

c++ - C++ 中的 unordered_map/set 是否有更快的散列函数?