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和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),因为它使用哈希函数来快速定位键值对。

定义

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTP之响应消息Response

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ HTTP之响应消息Response 1 Response 组成2 状态…

基于SpringBoot+Vue+MySQL的实践性教学系统

系统展示 用户前台界面 后台界面 系统背景 随着信息技术的快速发展&#xff0c;企业对于高效、智能的管理系统需求日益迫切。传统的管理系统大多采用单机版或C/S架构&#xff0c;存在操作复杂、维护困难、数据共享性差等问题。而基于SpringBootVueMySQL的全栈管理系统&#xff…

通信协议——UART

目录 基础概念串行&并行串行的优缺点 单工&双工 UART基本概念时序图思考&#xff1a;接收方如何确定01和0011 基础概念 串行&并行 串行为8车道&#xff0c;并行为1车道 串行的优缺点 通行速度快浪费资源布线复杂线与线之间存在干扰 单工&双工 单工&#xf…

018集——c# 实现CAD添加侧栏菜单(WPF控件)(CAD—C#二次开发入门)

本例实现的效果如下&#xff1a; 第一步&#xff1a;添加引用 using UserControl System.Windows.Controls.UserControl; using System.Windows.Forms.Integration;//PaletteSet integration 第二步 <UserControl x:Class"AcTools.UserControl1"xmlns"htt…

【数据分析】Power BI的使用教程

目录 1 Power BI架构1.1 Power BI Desktop1.2 Power BI服务1.3 Power BI移动版 2 Power Query2.1 Power Query编辑器2.2 Power Query的优点2.3 获取数据2.4 数据清洗的常用操作2.4.1 提升标题2.4.2 更改数据类型2.4.3 删除错误/空值2.4.4 删除重复项2.4.5 填充2.4.6 合并列2.4.…

【Airtest】 UI 自动化

一、环境配置 项目名称&#xff1a;Yavin 锁定python3.7.x和opencv-contrib-python3.4.2.17&#xff0c;不然各种报错 参考airtest官网https://airtest.doc.io.netease.com/ 虚拟环境配置 安装所需要的依赖包 二、框架使用方式 1.目录结构介绍 2.config文件config.yaml文…

前端开发设计模式——状态模式

目录 一、状态模式的定义和特点 二、状态模式的结构与原理 1.结构&#xff1a; 2.原理&#xff1a; 三、状态模式的实现方式 四、状态模式的使用场景 1.按钮的不同状态&#xff1a; 2.页面加载状态&#xff1a; 3.用户登录状态&#xff1a; 五、状态模式的优点 1.提…

【深度学习基础】详解Pytorch搭建CNN卷积神经网络实现手写数字识别

MNIST 数据集,其包含70000 个2828 的手写数字的数据集,其中又分为60000 个训练样本与10000 个测试样本。 安装实验用到的包 anaconda promt 安装python包, 首先在开始界面打开prompt 进入到相应的虚拟环境中,下面的python38你自己创建的虚拟环境名称。 # 激活虚拟环境,v…

Ubuntu 24.04 系统上配置 Node.js 运行环境

本文我们重点介绍两种安装 Node.js 的方法。第一种方法使用 NVM (Node VersionManager)&#xff0c;这是安装和管理多个 Node.js 版本的最好和最快的方法。第二种方法使用官方包存储库在 Ubuntu 上安装 Node.js&#xff0c;一次只允许安装一个版本。 必备条件 A running Ubun…

yarn的安装与使用以及与npm的区别(安装过程中可能会遇到的问题)

一、yarn的安装 使用npm就可以进行安装 但是需要注意的一点是yarn的使用和node版本是有关系的必须是16.0以上的版本。 输入以下代码就可以实现yarn的安装 npm install -g yarn 再通过版本号的检查来确定&#xff0c;yarn是否安装成功 yarn -v二、遇到的问题 1、问题描述…

特斯拉Optimus:展望智能生活新篇章

近日&#xff0c;特斯拉举办了 "WE ROBOT" 发布会&#xff0c;发布会上描绘的未来社会愿景&#xff0c;让无数人为之向往。在这场吸引全球无数媒体的直播中&#xff0c;特斯拉 Optimus 人形机器人一出场就吸引了所有观众的关注。从多家媒体现场拍摄的视频可以看出来&…

Ubuntu 上安装 Redmine 5.1 指南

文章目录 官网安装文档&#xff1a;命令步骤相关介绍GemRubyRailsBundler 安装 Redmine更新系统包列表和软件包&#xff1a;安装必要的依赖&#xff1a;安装 Ruby&#xff1a;安装 bundler下载 Redmine 源代码&#xff1a;安装 MySQL配置 Redmine 的数据库配置文件&#xff1a;…

Java 基于 poi 和 itextpdf 实现 excel 转 pdf

目录 问题 实现思路 pom Excel2PDFUtil Excel2PDFUtilTest 输出结果 问题 工作中遇到一个需求&#xff0c;需要实现 excel 文件的预览&#xff0c;实现的思路就是将 excel 转成 pdf 文件&#xff0c;上传到文件服务器上得到文件地址&#xff0c;预览时只需要返回 pdf 预…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性&#xff0c;无法实现跨平台完全兼容&#xff0c;例如&#xff1a;微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制&#xff0c;可以针对特定的平台编译执行特定的代码&#xff0c;否则不执行。…

[JAVAEE] 线程安全的案例(一)-单例模式

目录 一. 单例模式 二. 单例模式的使用时机 三. 单例模式的关键代码 四. 单例模式的几种实现方式 4.1 饿汉方式(急) 4.2 懒汉模式(缓) a. 解决原子性的问题 b. 解决程序运行效率低下的问题 c. 解决指令重排序的问题(其次是为了解决内存可见性的问题) 五. 总结 一. …

【大模型实战篇】大模型分词算法BPE(Byte-Pair Encoding tokenization)及代码示例

词元化是针对自然语言处理任务的数据预处理中一个重要步骤&#xff0c;目的是将原始文本切分成模型可以识别和处理的词元序列。在大模型训练任务中&#xff0c;就是作为大模型的输入。传统的自然语言处理方法&#xff0c;如基于条件随机场的序列标注&#xff0c;主要采用基于词…

Nest.js 实战 (十五):前后端分离项目部署的最佳实践

☘️ 前言 本项目是一个采用现代前端框架 Vue3 与后端 Node.js 框架 Nest.js 实现的前后端分离架构的应用。Vue3 提供了高性能的前端组件化解决方案&#xff0c;而 Nest.js 则利用 TypeScript 带来的类型安全和模块化优势构建了一个健壮的服务端应用。通过这种技术栈组合&…

phpstorm中使用FTP功能和自动上传配置介绍

phpstorm中使用FTP功能和自动上传配置介绍 一、引言 PHPStorm 是一款强大的 PHP IDE&#xff0c;它提供了许多便捷的功能来提高开发效率。其中&#xff0c;内置的 FTP 功能允许开发者直接在 IDE 中上传文件到服务器&#xff0c;而自动上传配置则可以进一步简化这一过程。本文…

ISUP协议视频平台EasyCVR私有化视频平台视频汇聚/存储系统怎么选?

一、EasyCVR视频监控存储系统的核心优势 TSINGSEE青犀EasyCVR视频汇聚平台是一个具备高度集成化、智能化的视频监控汇聚管理平台&#xff0c;拥有远程视频监控、录像、存储、回放、语音对讲、云台控制、告警等多项核心功能。该系统采用先进的网络传输技术&#xff0c;支持高清…

Servlet(三)-------Cookie和session

一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件&#xff0c;由服务器发送给浏览器。当用户再次访问同一网站时&#xff0c;浏览器会把Cookie信息发送回服务器。例如&#xff0c;网站可以利用Cookie记住用…