C++ 编程基础:深入理解 `pair`(键值对) 和 `unordered_map`(无序映射)

C++ 编程基础:深入理解 pair(键值对) 和 unordered_map(无序映射)

在 C++ 标准库中,pair(键值对)和 unordered_map(无序映射)是两种常用的数据结构,它们广泛应用于各种编程场景。pair 用于存储两个相关联的值,而 unordered_map 通过哈希表来存储键值对,并提供高效的查找操作。本文将详细介绍这两种数据结构的定义、应用场景、核心原理和实现方法,并通过代码示例来说明它们的具体用法。

文章目录

    • [C++ 编程基础:深入理解 `pair`(键值对) 和 `unordered_map`(无序映射)](#C++ 编程基础:深入理解 pair(键值对) 和 unordered_map(无序映射))
      • 一、概述
      • 二、`pair`(键值对)详解
        • [2.1 `pair` 的定义](#2.1 pair 的定义)
        • [2.2 应用场景](#2.2 应用场景)
        • [2.3 示例代码](#2.3 示例代码)
        • [2.4 注意事项](#2.4 注意事项)
      • 三、`unordered_map`(无序映射)详解
        • [3.1 `unordered_map` 的定义](#3.1 unordered_map 的定义)
        • [3.2 应用场景](#3.2 应用场景)
        • [3.3 示例代码](#3.3 示例代码)
        • [3.4 注意事项](#3.4 注意事项)
      • [四、`pair` 和 `unordered_map` 的联系(★可直接看表格对比)](#四、pairunordered_map 的联系(★可直接看表格对比))
        • [4.1 对比表格](#4.1 对比表格)
        • [4.2 示例:`unordered_map` 和 `pair` 的结合使用](#4.2 示例:unordered_mappair 的结合使用)
      • 五、结论

一、概述

pair(键值对) 是 C++ 中的一种简单结构,用于将两个相关联的值绑定在一起。常用于需要将两个数据成对存储的场景,如坐标对(x, y),或需要保存键值对时使用的 unordered_map 之类的数据结构。

unordered_map(无序映射) 则是一种基于哈希表的键值对容器,能够通过键快速查找对应的值。在 C++ 中,unordered_map 允许以 O(1) 的时间复杂度进行查找、插入和删除操作,适用于大规模数据的高效处理。

二、pair(键值对)详解

2.1 pair 的定义

pair 是 C++ 标准库中的模板类,用于将两个相关联的值存储在一起。它包含两个成员变量,firstsecond,分别表示这两个元素。通过 pair,我们可以将两个不同类型的值结合在一起,形成一个简单的键值对结构。

定义

cpp 复制代码
template <class T1, class T2>
struct pair {
    T1 first;  // 第一个值
    T2 second; // 第二个值
};
2.2 应用场景

pair 广泛用于需要将两个数据关联存储的场景。它特别适用于以下情况:

  • 关联数据 :在某些情况下,我们需要将两个相关数据存储在一起,例如一个键和它对应的值。pair 提供了一种简单的方式来实现这一点。
  • 返回多个值 :在函数中,pair 也可以用作返回多个值的方式,因为 C++ 函数一次只能返回一个对象。使用 pair 可以让函数同时返回两个相关联的值。

尽管 pair 可以在某些数据结构中使用(例如 mapunordered_map),但这里强调的是它自身的结构特性,不应与这些数据结构混淆。

2.3 示例代码

以下代码展示了如何使用 pair 存储两个相关联的数据(一个整数和一个字符串),并输出它们的值。

cpp 复制代码
#include <iostream>
#include <utility> // 引入pair的头文件
using namespace std;

int main() {
    pair<int, string> p; // 定义一个pair,类型为int和string
    p.first = 1;         // 设置第一个值
    p.second = "apple";  // 设置第二个值

    cout << "第一个值:" << p.first << endl;   // 输出第一个值
    cout << "第二个值:" << p.second << endl;  // 输出第二个值

    return 0;
}

解释 :在这个例子中,pair 被用来存储一个整数和一个字符串,通过 p.first 访问第一个元素,p.second 访问第二个元素。程序输出:

第一个值:1
第二个值:apple
2.4 注意事项
  • 类型限制pair 的两个元素可以是不同的类型,但每个元素的类型必须在声明时确定。即使 pair 可以存储任意类型的组合,但设计时应考虑到使用场景。
  • 用途有限pair 仅能存储两个值。如果需要存储多个相关值,建议使用 tuple(元组),它允许存储任意数量的元素。

三、unordered_map(无序映射)详解

3.1 unordered_map 的定义

unordered_map 是 C++ 标准库中基于哈希表的容器,用于存储键值对。它的查找、插入和删除操作的平均时间复杂度为 O(1),因为它使用哈希函数来快速定位键值对。

定义

cpp 复制代码
template <class Key, class T>
class unordered_map {
    // 存储 Key 和 T 类型的键值对
};
3.2 应用场景

unordered_map(无序映射)非常适用于需要通过键快速查找值的场景,例如频率统计、数据分类等。它常用于实现哈希表相关的算法,如词频统计、缓存系统等。

3.3 示例代码

以下代码展示了如何使用 unordered_map 存储多个键值对,并查找某个键是否存在。

cpp 复制代码
#include <iostream>
#include <unordered_map> // 引入unordered_map的头文件
using namespace std;

int main() {
    // 定义一个unordered_map,键为int,值为string
    unordered_map<int, string> umap;

    // 插入键值对
    umap[1] = "apple";
    umap[2] = "banana";
    umap[3] = "cherry";

    // 查找键为2的值
    if (umap.find(2) != umap.end()) {
        cout << "键为2的值是:" << umap.at(2) << endl; // 输出:banana
    }

    // 遍历unordered_map
    for (const auto& entry : umap) {
        cout << "键:" << entry.first << ", 值:" << entry.second << endl;
    }

    return 0;
}

解释 :在这个例子中,使用 unordered_map 存储了三个键值对。程序首先通过 find 方法查找键 2 对应的值,若找到则输出其值。随后,程序遍历 unordered_map 并输出所有键值对。输出如下:

键为2的值是:banana
键:1, 值:apple
键:2, 值:banana
键:3, 值:cherry
3.4 注意事项
  • 哈希冲突 :由于 unordered_map 基于哈希表,可能会发生哈希冲突(即不同的键计算出的哈希值相同)。在这种情况下,unordered_map 通过链表等方式处理冲突。
  • 键类型要求 :键必须能够通过哈希函数计算出哈希值,因此通常要求键类型满足以下条件:
    • 支持相等比较 :键类型必须实现 == 操作符,以便在查找、插入和删除时比较键的相等性。
    • 可哈希 :键类型需要支持哈希函数(如 std::hash),这通常意味着自定义类型需要提供哈希函数的重载,以便能够在 unordered_map 中正确工作。

四、pairunordered_map 的联系(★可直接看表格对比)

在 C++ 中,unordered_map 内部是通过 pair 来存储键值对的。每个 unordered_map 元素实际上是一个 pair<const Key, T>,其中 Key 是键,T 是值。

4.1 对比表格
特性 pair unordered_map
存储结构 仅存储两个相关值 存储键值对,基于哈希表
查找效率 不支持直接查找 平均 O(1) 时间复杂度查找
用途 简单关联数据存储 高效键值对存储与查找
元素个数 仅可存储两个元素 可存储多个键值对
应用场景 坐标、返回多个值的函数 频率统计、数据分类等
4.2 示例:unordered_mappair 的结合使用

以下代码展示了如何将 unordered_map 中的键值对转存到一个 vector<pair> 中,并对其进行排序。

cpp 复制代码
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;

// 比较函数,用于按值的大小排序
bool cmp(const pair<int, string>& a, const pair<int, string>& b) {
    return a.second < b.second; // 按值从小到大排序
}

int main() {
    unordered_map<int, string> umap;
    umap[1] = "banana";
    umap[2] = "apple";
    umap[3] = "cherry";

    // 将unordered_map转换为vector<pair>
    vector<pair<int, string>> vec(umap.begin(), umap.end());

    // 按照值进行排序
    sort(vec.begin(), vec.end(), cmp);

    // 输出排序后的键值对
    for (const auto& pair : vec) {
        cout << "键:" << pair.first << ", 值:" << pair.second << endl;
    }

    return 0;
}

解释 :在这个例子中,首先将 unordered_map 中的键值对存入 vector<pair>,然后使用自定义的比较函数按值对键值对进行排序。程序输出按值排序后的键值对:

键:2, 值:apple
键:1, 值:banana
键:3, 值:cherry

五、结论

pairunordered_map 是 C++ 标准库中用于存储和操作键值对的两种重要数据结构pair 提供了简单的成对元素存储机制,而 unordered_map 则提供了高效的键值映射。两者经常结合使用,unordered_map 通过 pair 存储键值对,使得键值操作更加灵活和高效。

对于初学者,理解这两种数据结构的概念及其应用场景,可以帮助在实际编程中更好地管理和处理数据。通过本文的示例代码,你可以直观地理解它们的实现和作用,并在需要时灵活运用。

✨ 我是专业牛,一个渴望成为大牛🏆的985硕士🎓,热衷于分享知识📚,帮助他人解决问题💡,为大家提供科研、竞赛等方面的建议和指导🎯。无论是科研项目🛠️、竞赛🏅,还是图像🖼️、通信📡、计算机💻领域的论文辅导📑,我都以诚信为本🛡️,质量为先!🤝

如果你觉得这篇文章对你有所帮助,别忘了点赞👍、收藏📌和关注🔔!你的支持是我继续分享知识的动力🚀!✨ 如果你有任何问题或需要帮助,随时留言📬或私信📲,我都会乐意解答!😊

相关推荐
长弓聊编程10 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.17 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
暮色_年华31 分钟前
Modern Effective C++item 9:优先考虑别名声明而非typedef
c++
重生之我是数学王子39 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
做人不要太理性1 小时前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
程序员-King.2 小时前
2、桥接模式
c++·桥接模式
chnming19872 小时前
STL关联式容器之map
开发语言·c++
程序伍六七2 小时前
day16
开发语言·c++
小陈phd2 小时前
Vscode LinuxC++环境配置
linux·c++·vscode