2017-01-29 22 views
0

我想用可定義狀態的函數作爲unordered_set的散列函數,我遇到的問題是我不知道如何初始化函子傳遞爲模板參數。這將是這樣的。使用functor作爲無序散列函數

class A{ 
    private: 
     class Hasher{ 
      private: 
       int a; 
      public: 
       Hasher(int val=3):a(val){}; 
       size_t operator()(const string & s) const{ 
        return s[0]*a; 
       } 
     }; 
     unordered_set<string,Hasher??> us; 
     int hasher_val; 

    public: 
     A(int h_val):hasher_val(h_val){}; 
} 

問題是,我怎樣才能定義一個不同於3的值?

回答

1

std::unordered_setconstructor has optional parameters可用於初始化其散列比如:

unordered_set<string,Hasher> us; 
    int hasher_val; 

public: 
    A(int h_val) : us{51, Hasher(4)}, hasher_val{h_val}{}; 

一個稍微不太舒服的事實是,哈希實例是第二個參數,你必須明確指定你的散列桶的大小,而不是依靠你的C++庫的智慧來提供一個合適的默認值(在我的例子中,我只是選擇了51我的頭頂,這可能是非常非常錯誤的,但這是一個不同的問題。 )。

您應該花幾分鐘時間挖掘您的頭文件,以確定C++實現使用的默認值,該設置的存儲桶大小,並提供相同的值。

P.S.所有庫容器都使用相同的方法:它們的構造函數的參數都是默認的,這使得使用自定義哈希類實例,自定義比較類實例等顯式構造它們成爲可能......

+0

根據http:///stackoverflow.com/a/14182624/3313064,您可以傳遞0或從另一個實例獲取默認桶數。 –

+0

非常感謝!這就是我正在尋找的東西,就像@ christian-hackl指出的那樣,文檔表明0值是初始桶大小的完美值,同樣也非常感謝。 – user3325504