有两种方法:
1、自定义新struct的hash函数,和==操作符,使用的时候需要指定unordered_set的第三个模板参数:
#include <iostream>
#include <unordered_map>
struct MyStruct {
std::string name;
int id;
// 自定义哈希函数
struct Hash {
std::size_t operator()(const MyStruct& s) const {
// 结合哈希函数
return std::hash<std::string>{}(s.name) ^ (std::hash<int>{}(s.id) << 1);
}
};
// 自定义相等函数,用于处理哈希冲突
bool operator==(const MyStruct& other) const {
return name == other.name && id == other.id;
}
};
int main() {
std::unordered_map<MyStruct, int, MyStruct::Hash> myMap;
// 添加元素
MyStruct key1{"Alice", 1};
myMap[key1] = 42;
// 查询元素
auto it = myMap.find(key1);
if (it != myMap.end()) {
std::cout << "Found: " << it->second << std::endl;
} else {
std::cout << "Not Found" << std::endl;
}
return 0;
}
2、特化std命名空间下的hash模板类。这个有个好处是不需要指定unordered_set、unordered_map第三个模板参数
#include <iostream>
#include <unordered_map>
struct MyStruct {
std::string name;
int id;
};
namespace std {
template <>
struct hash<MyStruct> {
std::size_t operator()(const MyStruct& s) const {
// 使用组合哈希值的方式
return hash<std::string>{}(s.name) ^ (hash<int>{}(s.id) << 1);
}
};
}
int main() {
std::unordered_map<MyStruct, int> myMap;
// 添加元素
MyStruct key1{"Alice", 1};
myMap[key1] = 42;
// 查询元素
auto it = myMap.find(key1);
if (it != myMap.end()) {
std::cout << "Found: " << it->second << std::endl;
} else {
std::cout << "Not Found" << std::endl;
}
return 0;
}