如何散列std :: string_view?

时间:2018-03-16 19:06:46

标签: c++ hash c++17 string-view

我正在尝试为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;

我得到的错误是:

no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)

根据cppreference on std::hash,哈希函数应该支持std::string_view。我觉得我错过了一些简单但我无法理解的东西。

2 个答案:

答案 0 :(得分:4)

您使用std::hash错误。 std::hash是一个提供哈希对象的operator()的类。您试图将对象传递给它的构造函数,因为它只有一个默认的consdtructor。您的operator()也需要标记为const。我们把所有这些放在一起,我们得到:

struct my_hash {
    unsigned long operator()(const TestStruct& test) const {
        return std::hash<std::string_view>()(std::string_view(test.a));
    }
};

答案 1 :(得分:3)

std::hash是一个类模板,不是一个功能模板。你需要一个实例来调用它:

return std::hash<std::string_view>()(std::string_view(test.a));