错误:哈希函数必须可以使用键类型的参数调用

Hen*_*ade 0 c++ hashmap c++11

我正在使用带有 的自定义哈希函数unordered_map,但出现此错误:

error: static assertion failed: hash function must be invocable with an argument of key type
Run Code Online (Sandbox Code Playgroud)

当我使用unordered_multimap.

我的代码:

#include<vector>
#include<string>
#include<unordered_map>

using namespace std;

class Hasher {
public:
    size_t operator() (string const& key) const {
        size_t hash = 0;
        for(size_t i = 0; i < key.size(); i++) {
            hash += key[i] % 7;
        }
        return hash;
    }
};

int main(int argc, char const *argv[]) {

    unordered_multimap<int, int, Hasher, equal_to<int>> hashmap;

    hashmap.insert(make_pair(1, 11));
    hashmap.insert(make_pair(1, 21));
    hashmap.insert(make_pair(2, 12));
    hashmap.insert(make_pair(3, 13));

    auto range = hashmap.equal_range(1); 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

zhm*_*zhm 5

您在关键使用不匹配的类型unordered_mapoperator()Hasher

您的代码应该是(请注意内联注释):

#include<vector>
#include<string>
#include<unordered_map>

using namespace std;

class Hasher {
public:
    size_t operator() (string const& key) const {     // the parameter type should be the same as the type of key of unordered_map
        size_t hash = 0;
        for(size_t i = 0; i < key.size(); i++) {
            hash += key[i] % 7;
        }
        return hash;
    }
};

int main(int argc, char const *argv[]) {

    unordered_multimap<std::string, int, Hasher, equal_to<std::string>> hashmap;  // key should be string type

    hashmap.insert(make_pair("1", 11));   // key should be string type
    hashmap.insert(make_pair("1", 21));
    hashmap.insert(make_pair("2", 12));
    hashmap.insert(make_pair("3", 13));

    auto range = hashmap.equal_range("1");    // equal_range's parameter should be the same type as key

    return 0;
}
Run Code Online (Sandbox Code Playgroud)