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.rhkb.cn/news/458524.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm虚拟机介绍

Java虚拟机&#xff08;JVM&#xff09;是Java语言的运行环境&#xff0c;它基于栈式架构&#xff0c;通过加载、验证、准备、解析、初始化等类加载过程&#xff0c;将Java类文件转换成平台无关的字节码&#xff0c;并在运行时动态地将其翻译成特定平台的机器码执行。 JVM的核心…

App测试环境部署

一.JDK安装 参考以下AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 二.SDK安装 安装地址&#xff1a;https://www.androiddevtools.cn/ 解压 环境变量配置 变量名&#xff1a;ANDROID_SDK_HOME 参考步骤&#xff1a; A…

K8s中TSL证书如何续期

TSL是什么 K8s中的作用是什么&#xff1f; 在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;TSL 指的是 Transport Layer Security&#xff0c;也就是传输层安全协议。它是用来保护在网络上传输的数据的安全性和隐私性。 TSL 在 Kubernetes 中的作用包括&#xff1a;…

铜业机器人剥片 - SNK施努卡

SNK施努卡有色行业电解车间铜业机器人剥片 铜业机器人剥片技术是针对传统人工剥片效率低下、工作环境恶劣及生产质量不稳定的痛点而发展起来的自动化解决方案。 面临人工剥片的诸多挑战&#xff0c;包括低效率、工作环境差、人员流动大以及产品质量控制不精确等问题。 人工剥片…

OSPF特殊区域及其他特性

不用的链路这状态信息没必要一直保存&#xff0c;要不路由器承受不了。用OSPF 特殊区域解决 1. Stub区域和Totally Stub区域 R1作为ASBR引入多个外部网段&#xff0c;如果Area 2是普通区域&#xff0c;则R3将向该区域注入5类和4类LSA。 当把Area 2配置为Stub区域后&#xff1a…

51单片机之蜂鸣器驱动

1.简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、 复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。   压电式蜂鸣器主要…

Linux练习_2账户管理

题目描述1 建立用户组 [rootlocalhost ~]# groupadd -g 2000 shengchan [rootlocalhost ~]# groupadd -g 2001 caiwu [rootlocalhost ~]# groupadd -g 2002 jishu [rootlocalhost ~]# tail -3 /etc/group shengchan:x:2000: caiwu:x:2001: jishu:x:2002: [rootlocalhost ~]# 建…

【IC每日一题】

IC每日一题 1 组合逻辑VS时序逻辑1.1 组合逻辑1.1.1 竞争冒险1.1.2 解决方法 1.2 时序逻辑1.3 比较1.4 场景 2 计数器2.1 代码片段法2.2 实现计数器--异步复位&#xff0c;带clear端&#xff0c;计10则归0&#xff1b; 1 组合逻辑VS时序逻辑 1.1 组合逻辑 组合逻辑&#xff1…

SSM-Springboot笔记(2)- SpringBoot常用开发技能

1 SpringBoot常用开发技能 1.1 项目架构 创建项⽬配置启动类建⽴对应的包&#xff0c;先建⽴这些包&#xff0c;其他⽤到再补充 controller service mapper domain utils1.2 开发HTTP接⼝GET请求 GET请求 场景&#xff1a;⼀般的查询接⼝就是get请求 注解&#xff1a;GetMappin…

Android在kts中使用navigation及Args

Android在kts中使用navigation及Args 前言&#xff1a; ​ 之前在项目中使用过navigation&#xff0c;但都是以Groory的方式&#xff0c;最近一年多使用kts后忍不住把项目都改成kts的方式&#xff0c;不过其中也遇到不少坑&#xff0c;今天就讲解一下如何在kts中使用navigati…

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

固态硬盘缺陷&#xff1a;无法长时间使用&#xff0c;而磁盘只要不消磁&#xff0c;只要不受到磁影响&#xff0c;就可以长期使用&#xff0c;因此绝大多数企业还是使用磁盘来存储数据 像mysql这种关系型数据库中的数据存储在磁盘中&#xff0c;为方便查询&#xff0c;减少系统…

springboot襄阳华侨城奇幻度假区服务平台-计算机毕业设计源码93560

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 开发技术 1.3.1 B/S架构 1.3.2 Spring Boot框架 1.3.3 Java语言 1.3.4 MySQL数据库 1.4论文章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 登录流程 2.2.2数据删除流程 2.3 系统…

2024年好用不踩雷的8款图纸加密软件推荐!CAD图纸加密软件!

在2024年&#xff0c;随着信息安全需求的提升&#xff0c;特别是对于设计、建筑、制造等行业的CAD图纸保护&#xff0c;图纸加密软件的选择尤为重要。以下推荐了8款优质的CAD图纸加密软件&#xff0c;这些软件不仅提供了强大的加密功能&#xff0c;还在易用性和兼容性方面表现出…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …

MongoDB快速入门

MongoDB 概念 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在MongoDB中数据主要的组织…

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

自由学习记录(15)

Java注解 else if的省略问题&#xff08;可能看花&#xff09; else if也是取最近的if连通&#xff0c;看上去加了{}就可以正常执行了&#xff0c;缩进要命&#xff0c;不提示真容易看错&#xff0c; 组合数公式和数组参数 在 C 中&#xff0c;数组作为函数参数时&#xff0c;…

【课件分享】蓝光光盘及光驱团标解读

关注我们 - 数字罗塞塔计划 - 10月26日&#xff0c;非常感谢陶光毅老师携特邀嘉宾许斌老师和游泳总能够在百忙之中抽空莅临数字罗塞塔计划直播间&#xff0c;为大家带来蓝光光盘及光驱团标解读。作为标准的起草者&#xff0c;你们的专业见解和宝贵经验&#xff0c;让我们对T/CE…

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…