2017-01-29 26 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