如何在C++中创建自定义类的unordered_map?
在C++中,
“`unordered_map“`是一个非常有用的容器,它可以存储键值对,并且能够在常数时间内将键转换为对应的值。然而,“`unordered_map“`仅仅能够存储基本数据类型和STL容器,如果想要存储自定义类型的数据时该怎么办呢?本文将对如何在C++中创建自定义类的“`unordered_map“`进行详细介绍。
在C++中创建自定义类
首先,我们需要定义一个自定义类。在这个例子中,我们定义一个名为
“`Person“`的类,其中每个对象都包含一个年龄(age)和一个姓名(name)。
#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
class Person{
public:
int age;
string name;
};
在C++中创建自定义类的unordered_map
要在C++中创建自定义类的
“`unordered_map“`,我们需要定义一个哈希函数(hash function),使用这个哈希函数来生成哈希值,并且还需要定义一个相等函数(equality function),用于比较两个键的值是否相等。这两个函数都应该返回布尔类型的值。这两个函数的原型如下所示:
size_t hash_func(const Person &p) { // 哈希函数
// ...
}
bool equal_func(const Person &p1, const Person &p2) { // 相等函数
// ...
}
现在我们来看看如何在C++中创建我们自己的
“`unordered_map“`。
// 定义哈希函数
size_t hash_func(const Person &p) {
size_t h1 = hash<int>()(p.age);
size_t h2 = hash<string>()(p.name);
return h1 ^ (h2 << 1);
}
// 定义相等函数
bool equal_func(const Person &p1, const Person &p2) {
return p1.age == p2.age && p1.name == p2.name;
}
// 创建自定义类的unordered_map
int main() {
unordered_map<Person, int, decltype(&hash_func), decltype(&equal_func)> myMap(10, hash_func, equal_func);
Person p1 = { 20, "Tom"};
Person p2 = { 25, "Jarry"};
Person p3 = { 20, "Rose"};
myMap[p1] = 100;
myMap[p2] = 200;
myMap[p3] = 300;
cout << myMap[p1] << endl;
cout << myMap[p2] << endl;
cout << myMap[p3] << endl;
return 0;
}
该程序将创建一个名为
“`myMap“`的“`unordered_map“`,键是“`Person“`对象,值是整型变量。“`myMap“`最初具有10个桶,并使用我们定义的哈希函数(hash_func)和相等函数(equal_func)。
我们接着添加了三对键值对。由于
“`unordered_map“`的键是“`Person“`类的实例,因此我们可以使用类的实例作为key来指定单个值。
最后,我们打印出三个键对应的值,输出结果应该为:
100
200
300
结论
在C++中创建自定义类的
“`unordered_map“`需要我们定义哈希函数和相等函数,并将它们与“`unordered_map“`一起传递。使用这些函数,我们可以存储任何自定义类的对象,并且可以像操作其他键值对一样使用它们。