2017-01-29 3 views
0

unordered_setのハッシャとして定義可能なファンクタを使用しようとしています。問題は直面していますが、渡されたファンクタを初期化する方法がわかりませんテンプレートパラメータそれはこのようなものでしょう。unordered_setハッシュ関数として定義可能な状態のファンクタを使用する

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」と異なる値に「a」をどのように定義できますか?

答えて

1

std::unordered_setそのハッシュインスタンスを初期化するために使用することができさんconstructor 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

関連する問題