2017-07-29 59 views
1

在做哈希一個std ::對,用在unordered_map

unordered_map<pair<unsigned int, unsigned int>, unsigned int> m; 

我們得到

錯誤C2338:C++標準並沒有爲這種類型提供一個哈希值。

是否有一個內置的方式來定義的int一個std::pair哈希還是我們需要手動定義的呢?(在這種情況下,哈希可能只是(第一項的字節)(該對中第二項的字節)粘在一起)。

注:我使用VC++ 2013

注2:答案pair<int,int> pair as key of unordered_map issue沒有明確解決如何實際上有兩個int S創建哈希,因爲這裏詳述的問題。

+2

如果你問的是C++標準的一部分,那麼沒有。 –

+0

沒有「內置的方式」;但是您可以自由定義和實施自己的專業化。 –

回答

1

如果你不想使用提升,滾動你自己不應該太難。 添加了static_assert以確保保持2個int適合1 size_t的假設。

using IntPair = std::pair<int, int>; 

struct IntPairHash { 
    static_assert(sizeof(int) * 2 == sizeof(size_t)); 

    size_t operator()(IntPair p) const noexcept { 
     return size_t(p.first) << 32 | p.second; 
    } 
}; 

std::unordered_map<IntPair, int, IntPairHash> myMap; 
+0

我不明白這個答案downvote。它不是* required *來專門化'std :: hash';這只是一個選擇。 – AndyG

+0

事實上,我會建議避免在這種情況下專門化std :: hash,因爲它影響的代碼範圍不僅僅是一個用例。當您是用戶定義的類型的客戶端時,不要專門化std :: hash,而您想要散列,但是當您是類型的提供者時,並且希望每個人都爲您的類型使用合理的散列函數。針對_standard_類型專門針對std :: hash增加了與其他人的專業化衝突並可能違反ODR的機會。 –