如何在C++中创建自定义类的unordered_map?

如何在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“`一起传递。使用这些函数,我们可以存储任何自定义类的对象,并且可以像操作其他键值对一样使用它们。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程