【问题标题】:How to hash std::string_view?如何散列std :: string_view?
【发布时间】:2018-03-16 19:06:46
【问题描述】:

我正在尝试为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。我觉得我错过了一些简单的东西,但我无法弄清楚。

【问题讨论】:

  • 你确定你在编译 C++17 吗?我想 C++14 仍然是许多编译器的默认设置。
  • @patatahooligan -std=c++1z 是当前编译器标志。
  • @Galik 很棒。这会导致一个烦人的错误。我将使用建议的修复更新我的帖子(不包括哈希修复 ofc)

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


【解决方案1】:

你用错了std::hashstd::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));
    }
};

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2020-04-12
      • 2021-09-29
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多