2014-11-05 35 views
1

我有我的專門的哈希函數使用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

任何人都知道爲什麼元素查找不起作用?

感謝

+0

不要使用指向'Node'的指針:每個'Node'具有不同的地址和不同的散列。指針值用作關鍵字,而不是指向的「節點」。 – 2014-11-05 05:17:42

+0

你的'unordered_set :: const_iterator'建議元素類型是'Node *'而不是'Node',所以散列專長是錯誤的。 – 2014-11-05 05:17:59

回答

1

因爲你unordered_set包含Node*而不是Node,指針被搜索,而不是對象本身。我不知道爲什麼find2會返回1,除非巧合,你有2個對象分配到同一個地方。

如果您嘗試使用一個散列函數,並且使用了Node*,它也不起作用,因爲unordered_set還需要工作==運算符來比較元素。

+0

嘿,很抱歉,我只是意識到我忘了接受你的答案。謝謝你的回答,不敢相信我沒有看到那個錯誤。 – duoren 2014-11-20 01:00:50

+0

@duoren道歉接受,謝謝!很高興我能夠提供幫助。 – 2014-11-20 02:16:49

相關問題