使用具有可定义状态的仿函数作为 unordered_set 哈希函数
Using functor with definable state as unordered_set hash function
我正在尝试使用具有可定义状态的仿函数作为 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_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。所有库容器都使用相同的方法:它们的构造函数的参数都是默认的,使得可以使用自定义哈希 class 实例、自定义比较器 class 实例等显式构造它们......
我正在尝试使用具有可定义状态的仿函数作为 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_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。所有库容器都使用相同的方法:它们的构造函数的参数都是默认的,使得可以使用自定义哈希 class 实例、自定义比较器 class 实例等显式构造它们......