gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:46 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com