c++ - 使用具有可定义状态的仿函数作为 unordered_set 哈希函数

标签 c++ hash stl functor

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

最佳答案

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++ 实现使用的默认值、集合的存储桶大小,并提供相同的值。

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

关于c++ - 使用具有可定义状态的仿函数作为 unordered_set 哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921767/

相关文章:

c++ - C++标准库的头文件在哪里

c++ - 为什么我在 "forming reference to reference type" map 中出现错误?

c++ - 与多对多处理器通信时出现 MPI 错误

带有桌面应用程序的 C++ 微服务

c++ - 将迭代器用于 STL 列表数组的语法

哈希函数和组合多个键

perl - 如何直接取消引用存储在另一个哈希中的哈希引用?

c++ - 如何在使用模板的类中包含另一个类?

c++ - 跨平台代码标签宏?

Windows系统文件哈希数据库