使用具有可定义状态的functor作为unordered_set哈希函数

时间:2017-01-29 14:07:19

标签: c++ hash stl 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){};
}

问题是,如何定义&#34; a&#34;对于不同于3的值?

1 个答案:

答案 0 :(得分:1)

std::unordered_set的{​​{3}}可用于初始化其哈希实例:

    unordered_set<string,Hasher> us;
    int hasher_val;

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

一个稍微不舒服的事实是哈希实例是第二个参数,你必须明确指定你的哈希桶大小,而不是依靠你的C ++库的智慧提供一个合适的默认值(在我的例子中,我只是从我的头顶挑了51,这可能是非常非常错的,但这将是一个不同的问题,要仔细考虑......)。

您应该花几分钟时间深入研究头文件,以确定C ++实现使用的默认值,对于set的桶大小,并提供相同的值。

P.S。所有库容器都使用相同的方法:它们的构造函数的参数都是默认的,这使得使用自定义哈希类实例,自定义比较器类实例等显式构造它们成为可能......