2014-03-26 87 views
1

我選擇了Java中的哈希表的概念,所以我意識到,對於用於自定義類的通用「哈希集合」容器,必須爲哈希函數和相應的相等函數提供定義。如何在C++中使用std :: unordered_set?

在Java中,這將意味着壓倒一切的方法

int hashCode() 

boolean equals (Object o) 

。我期待在C++的STL中使用相同的邏輯,但是在理解語法時遇到了困難。具體來說,std :: unordered_set <>接受5個模板參數(你能相信嗎?),它看起來像一個怪物,並讓我的頭旋轉。

所以我會很感激,如果人們可以舉一個簡單的例子當前玩具類:

class Some{ 
public : 
int a; 
}; 

其中的哈希函數返回的值,和平等測試功能返回true當且僅當成員'a'的值是相同的。

由於

+0

http://en.cppreference.com/w/cpp/utility/hash – user1520427

+0

'我選擇了Java中哈希表的概念[...]我期待着C++ STL中的相同邏輯請記住,Java和C++是不同的語言,需要不同的思維方式。 – fredoverflow

+0

'Key','Hash','KeyEqual'和'Allocator'是4個參數,而不是5個。 – fredoverflow

回答

4

步驟1:過載operator==你的類型:

bool operator==(const Some& x, const Some& y) 
{ 
    return x.a == y.a; 
} 

步驟2:專營std::hash你的類型:

namespace std 
{ 
    template<> 
    struct hash<Some> 
    { 
     typedef Some argument_type; 
     typedef size_t result_type; 

     size_t operator()(const Some& x) const 
     { 
      return x.a; 
     } 
    }; 
} 

步驟3:一個簡單的測試:

int main() 
{ 
    std::unordered_set<Some> test; 
    test.insert(Some{42}); 
} 

第4步:獲利!

1

我沒有編譯器,因此有可能是錯誤的,但它應該是類似於:

namespace std { 
    template <> 
    struct hash<Some> 
    { 
    typedef Some argument_type; 
    typedef std::size_t result_type; 

    result_type operator()(const Some & t) const 
    { 
     return t.a; 
    } 
    }; 
} 
+0

啊,我忘了'argument_type'和'result_type'!謝謝你提醒我。 – fredoverflow

+0

正如我所看到的那樣,您正在利用std :: unsorted_set默認情況下查找std :: hash 作爲用於計算給定對象之外的哈希值的函數對象的概念。 – Diaz

+0

我做了幾乎相同的事情,除了我創建了自己的類(而不是std :: hash <>),並且在聲明容器時將其指定爲Hasher。編譯器抱怨「無效的操作數到二進制表達式」,並且我不知道:( – Diaz

相關問題