面试题答案
一键面试1. 编写哈希函数
#include <iostream>
#include <unordered_map>
#include <functional>
class MyClass {
public:
int id;
std::string name;
// 假设还有其他成员变量
MyClass(int id, const std::string& name) : id(id), name(name) {}
};
namespace std {
template<>
struct hash<MyClass> {
std::size_t operator()(const MyClass& obj) const {
using std::hash;
using std::string;
// 结合多个成员变量生成哈希值
return hash<int>()(obj.id) ^ hash<string>()(obj.name);
}
};
}
2. 在哈希表中使用自定义哈希函数
int main() {
std::unordered_map<MyClass, int> myMap;
MyClass obj1(1, "Alice");
MyClass obj2(2, "Bob");
myMap[obj1] = 100;
myMap[obj2] = 200;
for (const auto& pair : myMap) {
std::cout << "Key: id = " << pair.first.id << ", name = " << pair.first.name
<< ", Value = " << pair.second << std::endl;
}
return 0;
}
在上述代码中:
- 首先定义了
MyClass
类,包含id
和name
成员变量。 - 然后在
std
命名空间中特化了hash<MyClass>
模板,实现了自定义的哈希函数,通过^
(异或)操作将id
和name
的哈希值结合起来。 - 在
main
函数中,创建了std::unordered_map
并使用MyClass
作为键,展示了如何在哈希表中使用自定义哈希函数。