📜  如何在 C++ 中创建元组的 unordered_map?(1)

📅  最后修改于: 2023-12-03 15:38:13.815000             🧑  作者: Mango

如何在 C++ 中创建元组的 unordered_map?

在 C++ 中,unordered_map 是一种使用哈希表实现的关联容器,它支持快速的查找、插入和删除操作。元组是一种在 C++11 中引入的新类型,可以将多个不同类型的数据组合在一起。

本文将介绍如何在 C++ 中创建元组的 unordered_map。

1. 头文件和命名空间

在使用 unordered_map 和元组之前,需要包含对应的头文件,并引用 std 命名空间:

#include <unordered_map>
#include <tuple>

using namespace std;
2. 创建元组的 unordered_map

在创建 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、指针等。如果想要将多个键映射到同一个值上,则需要在元组的比较操作中自定义比较函数。

3. 插入元素

可以使用 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 中,则插入操作会被忽略。

4. 访问元素

可以使用下标操作符([])或 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()。

5. 遍历元素

可以使用迭代器来遍历 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<> 函数来访问元组内的具体值。

6. 删除元素

可以使用 erase 函数从 unordered_map 中删除元素。下面的示例代码演示了如何删除 my_map 中的元素:

my_map.erase("key1");

上述代码中,erase 函数传入的参数是要删除元素的键。

7. 完整示例代码
#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。