ajo*_*eps 2 c++ hash string-view c++17
我正在尝试定义我自己的散列函数,std::unordered_map并且我想散列一个结构中的一个字段,该字段应该是键。下面的代码是我所拥有的简化版本:
struct TestStruct {
char a[64];
char b[64];
}
struct my_eq {
bool operator()(const TestStruct& test_1, const TestStruct& test_2) const {
return !strcmp(test_1.a, test_2.a) && !strcmp(test_1.b, test_2.b);
}
};
struct my_hash {
unsigned long operator()(const TestStruct& test) const {
return std::hash<std::string_view>(std::string_view(test.a));
}
};
std::unordered_map<TestStruct, int, my_hash,my_eq> map;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)
Run Code Online (Sandbox Code Playgroud)
根据cppreference上std::hash的hash函数应该支持std::string_view. 我觉得我错过了一些简单的东西,但我无法弄清楚。
你用std::hash错了。 std::hash是一个提供operator()散列对象的类。您试图将对象传递给它的构造函数,但它不起作用,因为它只有一个默认的构造函数。你的operator()也需要被标记const。我们把所有这些放在一起,我们得到:
struct my_hash {
unsigned long operator()(const TestStruct& test) const {
return std::hash<std::string_view>()(std::string_view(test.a));
}
};
Run Code Online (Sandbox Code Playgroud)