我有我的專門的哈希函數使用unordered_set一些問題。 我可以插入沒有問題的元素,但是當我嘗試使用find或count來查找其他元素時,它不起作用。它無法找到已經在集合中的元素。C++ unordered_set的計數和查找不起作用,如果它使用自定義類的類型作爲密鑰
這是我的散列函數:
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;
}
};
}
我Node類有一羣其他成員變量,但我只是結合X和Y這應該是足夠的,因爲我可以有把握地認爲不可能有2個節點相同的X和Y值。這是我用模板專門化弄髒我的手的第一次,我做錯了什麼?我想我可能不會正確地散列它們。
下面是一個例子來進一步澄清我的問題:
讓說我有一組稱爲MYSET包含4個節點(XY):< 1 7> < 2 7> < 3 7> < 1 8>
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(new Node(1,7))< < endl; //返回1
任何人都知道爲什麼元素查找不起作用?
感謝
不要使用指向'Node'的指針:每個'Node'具有不同的地址和不同的散列。指針值用作關鍵字,而不是指向的「節點」。 – 2014-11-05 05:17:42
你的'unordered_set :: const_iterator'建議元素類型是'Node *'而不是'Node',所以散列專長是錯誤的。 –
2014-11-05 05:17:59