如何实现C++标准库中的hash_map容器,使用自定义对象
时间: 2024-04-16 08:28:52 浏览: 99
要在C++中实现类似于hash_map的容器,你可以使用标准库中的unordered_map容器。unordered_map是一个使用哈希表实现的关联容器,可以存储键值对。
为了在unordered_map中使用自定义对象作为键,你需要提供哈希函数和相等比较函数。哈希函数用于将键映射到哈希值,相等比较函数用于判断两个键是否相等。
下面是一个示例,演示了如何在unordered_map中使用自定义对象作为键:
```cpp
#include <unordered_map>
#include <iostream>
#include <functional>
class MyObject {
public:
int x;
int y;
// 其他成员变量和方法
// 重载相等比较运算符
bool operator==(const MyObject& other) const {
return x == other.x && y == other.y;
}
};
// 哈希函数
namespace std {
template <>
struct hash<MyObject> {
std::size_t operator()(const MyObject& obj) const {
// 使用std::hash组合哈希值
return std::hash<int>()(obj.x) ^ std::hash<int>()(obj.y);
}
};
}
int main() {
std::unordered_map<MyObject, int> myMap;
MyObject obj1 {1, 2};
MyObject obj2 {3, 4};
myMap[obj1] = 10;
myMap[obj2] = 20;
std::cout << myMap[obj1] << std::endl; // 输出 10
std::cout << myMap[obj2] << std::endl; // 输出 20
return 0;
}
```
在上面的示例中,我们定义了一个名为MyObject的自定义类。我们重载了相等比较运算符==,以便unordered_map能够正确比较两个MyObject对象是否相等。
为了使unordered_map能够正确地使用MyObject对象作为键,我们还定义了一个哈希函数。在这个示例中,我们使用std::hash<int>来哈希MyObject对象的成员变量x和y,并使用异或操作符^将它们的哈希值组合起来。
最后在main函数中,我们创建了一个unordered_map实例myMap,将MyObject对象作为键,并进行一些操作来验证容器的功能。
请注意,这只是一个示例,你可能需要根据你自己的需求进行适当的修改和扩展。
阅读全文