其中键也是unordered

其中键也是unordered

我正在尝试将unordered_map与另一个unordered_map用作键(自定义哈希函数)。我还添加了一个自定义的equal函数,即使可能不需要它。

该代码无法满足我的期望,但是我无法了解正在发生的事情。出于某种原因,在执行find()时未调用equal函数,这是我期望的。

unsigned long hashing_func(const unordered_map<char,int>& m) {
    string str;
    for (auto& e : m)
        str += e.first;
    return hash<string>()(str);
}
bool equal_func(const unordered_map<char,int>& m1, const unordered_map<char,int>& m2) {
    return m1 == m2;
}

int main() {

    unordered_map<
        unordered_map<char,int>,
        string,
        function<unsigned long(const unordered_map<char,int>&)>,
        function<bool(const unordered_map<char,int>&, const unordered_map<char,int>&)>
        > mapResults(10, hashing_func, equal_func);

    unordered_map<char,int> t1 = getMap(str1);
    unordered_map<char,int> t2 = getMap(str2);

    cout<<(t1 == t2)<<endl; // returns TRUE
    mapResults[t1] = "asd";
    cout<<(mapResults.find(t2) != mapResults.end()); // returns FALSE

    return 0;
}

最佳答案

首先,肯定需要相等运算符,因此您应该保留它。

让我们看一下您的无序 map 的哈希函数:

string str;
for (auto& e : m)
    str += e.first;
return hash<string>()(str);

根据定义,由于它是无序映射,因此迭代器可以按任何顺序迭代无序映射的键。但是,由于哈希函数必须为相同的密钥产生相同的哈希值,因此该哈希函数显然将在这方面失败。

此外,我还希望散列函数除了键本身之外,还将包括无序映射键的值。我想您可能会想这样做-将两个无序映射视为相同的键,只要它们的键相同,而忽略它们的值即可。从这个问题尚不清楚您的期望是什么,但是您可能需要考虑一下。

关于c++ - C++ unordered_map,其中键也是unordered_map,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40788782/

10-09 18:59