2013-08-06 90 views
4

我可以用我自己定義的C++ 11中的std::hash替換std::hash的實際實現嗎?我可以重寫std :: hash嗎?

我的意思是從我的代碼庫,沒有觸及標準庫。

在這種情況下,我看不到虛擬函數/多態的任何用途,所以我想我不能改變std :: hash的定義嗎?

+1

您可以爲*您的*自己的類型專業化。 – Xeo

+0

@Xeo是的,我知道,但我對全球變化感興趣。 – user2485710

+0

可能重複[如何專門化std :: hash ::運算符()用於無序容器中的用戶定義類型?](https://stackoverflow.com/questions/8157937/how-to-specialize-stdhashkeyoperator-for用戶定義的類型在無序) –

回答

3

是沒關係的,你不必修改標準庫以任何方式,只要使用模板特:

namespace std 
{ 
    template<> 
    struct hash<YourSpecialType> 
    { 
     // ... 
    }; 
} 
+0

這對我自己的類型是微不足道的,我的意思是全球的作品... – user2485710

+3

@ user2485710啊,那麼沒有。然後你有叉標準庫。 –

+0

這就是我的想法,無論如何感謝 – user2485710

6

您可以專注哈希特定類型。 見herehere例如這樣

namespace std { 
    template <> struct hash<Foo> 
    { 
    size_t operator()(const Foo & x) const 
    { 
     /* your code here, e.g. "return hash<int>()(x.value);" */ 
    } 
    }; 
} 

如果你認爲你可以做得比庫實現者你是現有版本孰優孰劣 1.錯誤 或 2.聰明

+0

_3。 lazy_,所以我可以在不寫X新類型的情況下得到一個新的散列函數。 – user2485710

+0

「X新類型」?只需編寫一個myHash函數並使用它,但這可能不是懶惰 - 您必須先閱讀Knuth數小時才能找到正確的答案。 – doctorlove

+0

懶惰的部分確實是關於「寫作」的:D,但是要感謝提及Tex和其他算法和書籍的創造者。 – user2485710

相關問題