当前位置: 首页 > news >正文

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

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

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

文章目录

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

一、概述

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

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

二、pair(键值对)详解

2.1 pair 的定义

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

定义

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

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

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

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

2.3 示例代码

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

#include <iostream>
#include <utility> // 引入pair的头文件
using namespace std;int main() {pair<int, string> p; // 定义一个pair,类型为int和stringp.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),因为它使用哈希函数来快速定位键值对。

定义

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

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

3.3 示例代码

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

#include <iostream>
#include <unordered_map> // 引入unordered_map的头文件
using namespace std;int main() {// 定义一个unordered_map,键为int,值为stringunordered_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_mapfor (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 对比表格
特性pairunordered_map
存储结构仅存储两个相关值存储键值对,基于哈希表
查找效率不支持直接查找平均 O(1) 时间复杂度查找
用途简单关联数据存储高效键值对存储与查找
元素个数仅可存储两个元素可存储多个键值对
应用场景坐标、返回多个值的函数频率统计、数据分类等
4.2 示例:unordered_mappair 的结合使用

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

#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硕士🎓,热衷于分享知识📚,帮助他人解决问题💡,为大家提供科研、竞赛等方面的建议和指导🎯。无论是科研项目🛠️、竞赛🏅,还是图像🖼️、通信📡、计算机💻领域的论文辅导📑,我都以诚信为本🛡️,质量为先!🤝

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

http://www.lryc.cn/news/468167.html

相关文章:

  • 高德动态地图
  • springboot集成camunda学习与使用
  • 微服务架构学习笔记
  • 代码优化之简化if臃肿的判断条件
  • 【OpenAI】第六节(语音生成与语音识别技术)从 ChatGPT 到 Whisper 的全方位指南
  • Docker 下备份恢复oracle
  • oneplus3t-android_framework
  • 偷懒总结篇|贪心算法|动态规划|单调栈|图论
  • C语言初阶七:C语言操作符详解(1)
  • GO excelize 读取excel进行时间类型转换(自动转换)
  • 【算法与数据结构】二分查找思想
  • PHP PDO:安全、灵活的数据持久层解决方案
  • 九、Linux实战案例:项目部署全流程深度解析
  • GIS常见前端开发框架
  • Java | Leetcode Java题解之第506题相对名次
  • 数据结构 - 堆
  • html----图片按钮,商品展示
  • YOLOv11改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
  • redis高级篇之redis源码分析List类型quicklist底层演变 答疑159节
  • Elasticsearch 与 Lucene 的区别和联系
  • OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用
  • 【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据
  • WPF的UpdateSourceTrigger属性
  • 2024-09-25 环境变量,进程地址空间
  • 中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用
  • 青少年编程能力等级测评CPA C++ 四级试卷(1)
  • 树上任意两点的距离
  • 【 thinkphp8 】00008 thinkphp8数据查询,常用table,name方法,进行数据查询汇总
  • Git的命令合集
  • 博客搭建之路:hexo搜索引擎收录