【问题标题】:Using functor with definable state as unordered_set hash function使用具有可定义状态的函子作为 unordered_set 散列函数
【发布时间】:2017-01-29 14:07:18
【问题描述】:

我正在尝试使用具有可定义状态的仿函数作为 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”?

【问题讨论】:

    标签: c++ hash stl functor


    【解决方案1】:

    std::unordered_setconstructor has optional parameters可以用来初始化它的hash实例:

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

    一个有点不舒服的事实是哈希实例是第二个参数,你必须明确指定你的哈希桶大小,而不是依靠你的 C++ 库的智慧来提供合适的默认值(在我的例子中,我只是从我的头顶上选了 51,这可能是非常非常错误的,但那将是一个不同的问题……)。

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

    附:所有库容器都使用相同的方法:它们的构造函数的参数都是默认的,因此可以使用自定义哈希类实例、自定义比较器类实例等显式构造它们......

    【讨论】:

    • 根据stackoverflow.com/a/14182624/3313064,您可以只传递 0 或从另一个实例获取默认存储桶计数。
    • 非常感谢!这正是我一直在寻找的,就像@christian-hackl 指出的那样,文档表明 0 值是初始存储桶大小的完美值,也谢谢你。
    猜你喜欢
    • 2016-07-21
    • 2020-08-20
    • 2017-02-27
    • 2021-12-24
    • 1970-01-01
    • 2012-01-09
    • 2013-09-09
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多