📅  最后修改于: 2023-12-03 15:38:13.815000             🧑  作者: Mango
在 C++ 中,unordered_map 是一种使用哈希表实现的关联容器,它支持快速的查找、插入和删除操作。元组是一种在 C++11 中引入的新类型,可以将多个不同类型的数据组合在一起。
本文将介绍如何在 C++ 中创建元组的 unordered_map。
在使用 unordered_map 和元组之前,需要包含对应的头文件,并引用 std 命名空间:
#include <unordered_map>
#include <tuple>
using namespace std;
在创建 unordered_map 前,需要定义元组的类型,并指定其作为 unordered_map 的值:
using my_tuple = tuple<int, string, double>;
unordered_map<string, my_tuple> my_map;
上述代码定义了一个键类型为 string,值类型为 my_tuple 的 unordered_map。其中,my_tuple 是一个由 int、string 和 double 三个类型组成的元组类型。由于 unordered_map 只能按键查找元素,因此键类型必须是可哈希的,例如 int、string、指针等。如果想要将多个键映射到同一个值上,则需要在元组的比较操作中自定义比较函数。
可以使用 emplace 函数向 unordered_map 中插入元素。下面的示例代码向 my_map 中插入了两个元素:
my_map.emplace("key1", make_tuple(1, "abc", 3.14));
my_map.emplace("key2", make_tuple(2, "def", 2.71));
其中,make_tuple 函数用于创建一个元组。如果需要插入的元组已经存在于 unordered_map 中,则插入操作会被忽略。
可以使用下标操作符([])或 find 函数来访问 unordered_map 中的元素。下面的示例代码演示了如何访问 my_map 中的元素:
cout << get<0>(my_map["key1"]) << endl; // 输出 1
cout << get<1>(my_map["key2"]) << endl; // 输出 "def"
auto it = my_map.find("key1");
if (it != my_map.end()) {
cout << get<2>(it->second) << endl; // 输出 3.14
}
上述代码中,get<> 函数用于获取元组中的某个值。需要注意的是,如果访问不存在的键,unordered_map 会将其插入并返回一个默认值。因此,在使用下标操作符时,需要保证键已经存在;在使用 find 函数时,需要检查返回的迭代器是否等于 end()。
可以使用迭代器来遍历 unordered_map 中的元素。下面的示例代码演示了如何使用迭代器遍历 my_map 中的元素:
for (auto it = my_map.begin(); it != my_map.end(); ++it) {
auto key = it->first;
auto val = it->second;
cout << key << ": "
<< get<0>(val) << " "
<< get<1>(val) << " "
<< get<2>(val) << endl;
}
上述代码中,auto 关键字用于自动推导迭代器类型,it->first 和 it->second 分别用于访问键和值。由于元组的类型是在 unordered_map 中定义的,因此无法在遍历时使用元组名,需要使用 get<> 函数来访问元组内的具体值。
可以使用 erase 函数从 unordered_map 中删除元素。下面的示例代码演示了如何删除 my_map 中的元素:
my_map.erase("key1");
上述代码中,erase 函数传入的参数是要删除元素的键。
#include <iostream>
#include <unordered_map>
#include <tuple>
using namespace std;
using my_tuple = tuple<int, string, double>;
unordered_map<string, my_tuple> my_map;
int main() {
my_map.emplace("key1", make_tuple(1, "abc", 3.14));
my_map.emplace("key2", make_tuple(2, "def", 2.71));
cout << get<0>(my_map["key1"]) << endl; // 输出 1
cout << get<1>(my_map["key2"]) << endl; // 输出 "def"
auto it = my_map.find("key1");
if (it != my_map.end()) {
cout << get<2>(it->second) << endl; // 输出 3.14
}
for (auto it = my_map.begin(); it != my_map.end(); ++it) {
auto key = it->first;
auto val = it->second;
cout << key << ": "
<< get<0>(val) << " "
<< get<1>(val) << " "
<< get<2>(val) << endl;
}
my_map.erase("key1");
return 0;
}
上述代码演示了如何创建、插入、访问、遍历和删除元组的 unordered_map。