我在将 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/