我正在尝试将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/