2013-03-24 32 views
0

假設我用我自己的類作爲鍵std::unordered_map例如需要的std :: unordered_map構造

class MyClass { 
public: 
    int a, b; 
} 

www.cplusplus.com列出了下面的構造函數可用於:

explicit unordered_map (size_type n, 
         const hasher& hf = hasher(), 
         const key_equal& eql = key_equal(), 
         const allocator_type& alloc = allocator_type()); 

你能不能給一個例子,我可以如何使用上述構造函數的所有參數填充構造我的std::unordered_map<MyClass, std::string>

+2

【這裏這個例子(http://en.cppreference.com/w/cpp/container/unordered_map/unordered_map)應該給你一個好主意什麼是必須的。 – juanchopanza 2013-03-24 17:23:13

+0

@juanchopanza我明白哈希和key_equal函數可以被指定爲模板的一部分。但是,他們可以直接傳遞給構造函數,而無需在模板中指定它們?如果是這樣,怎麼樣? – 2013-03-24 17:34:44

+0

您只需將函數的實例傳遞給構造函數。特定的位置取決於你所調用的構造函數。 – juanchopanza 2013-03-24 17:36:47

回答

2

three std::unordered_map constructors作爲參數的散列和平等仿函數的實例。這個例子說明如何使用其中的一種:

struct MyHash { 
    std::size_t operator()(const MyClass& k) const { .... } 
}; 

struct MyEqual { 
    bool operator()(const MyClass& lhs, const MyClass& rhs) const { .... } 
}; 

std::unordered_map<MyClass, std::string, MyHash, MyEqual> m(42, // bucket count 
                  MyHash(), 
                  MyEqual()); 
+0

獲取以下編譯錯誤:''bool MyEqual :: operator ==(const MyClass&,const MyClass&)'必須使用gcc只需要一個參數'4.7.2 – 2013-03-24 17:47:21

+0

@VictorLyuboslavsky好的,我在代碼中發現錯誤。我在MyEqual類中犯了一個愚蠢的錯誤。現在它應該編譯。 – juanchopanza 2013-03-24 18:41:50

0

編寫一個能夠在unordered_map中用作鍵的類不是免費的,它們需要一個自定義的散列對象。

struct MyHash { 
    std::size_t operator()(const MyClass& k) const 
    { 
    // You may want to use a better hash function 
    return static_cast<std::size_t>(k.a)^static_cast<std::size_t>(k.b); 
    } 
}; 

然後,通過哈希函數映射作爲模板參數(其構造具有默認的構造函數哈希對象,所以你不需要手動傳遞):

std::unordered_map<MyClass, std::string, MyHash> m; 

或者,您可以在std命名空間中提供散列函數。現在

namespace std { 
    template <> 
    struct hash<MyClass> { 
    std::size_t operator()(const MyClass& k) const; // same as before 
    }; 
} 

,這正是預期:

std::unordered_map<MyClass, std::string> m; 

除了特殊要求unordered_map,你還需要定義一個operator==。 即使這也可以通過模板參數進行定製,我建議將其作爲全局函數編寫。

+0

它仍然需要相等比較函數,或者'operator ==(const MyClass&lhs,const MyClass&rhs)'。 – juanchopanza 2013-03-24 17:32:39

相關問題