关联容器-模板类pair数对

关联容器

关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。

关联容器支持高效的关键字查找和访问。

两个主要的关联容器(associative-container),set和map。

set 中每个元素只包含一个关键字。set 支持高效的关键字查询操作一一检查一个给定关键字是否在 set 中。

map 的元素是关键字-值 (key-value)对(也称键-值对)。其中关键字起到索引的作用,值则表示与索引相关联的数据。字典是一个很好的使用 map 的例子:可以将单词作为关键字,将单词释义作为值。

标准库针对set和map一共提供8种不同的关联容器。1.是否运行关键字重复;2.是否按顺序保存元素

set和multiset定义在头文件set中;map和multimap定义在头文件map中;无序容器则定义在头文件unordered set和unordered map中。 

pair 数对是什么

pair数对是 C++ 标准库中的一个模板类,它提供了一种简单的方式来将两个值组合成一个单元。这两个值可以是相同类型,也可以是不同类型。就好比一个小巧的容器,专门用来存放两个紧密相关的数据元素。例如,在处理平面直角坐标系中的点时,我们可以用一个pair来同时存储点的横坐标和纵坐标;在统计单词出现频率时,pair能将单词及其对应的出现次数放在一起。

使用时需要引用文件

#include <utility>//通用工具
namespace std {template <typename T1,typename T2>struct pair {T1 first; //成员1T2 second;//成员2...};
}

操作函数

pair应用举例

pair的基本操作举例:

#include <iostream>
#include <utility>
using namespace std;int main()
{pair<int, double>p1;//创建一个空的pair//注意访问first和second时没有()cout << "p1=(" << p1.first << "," << p1.second << ")" << endl;pair<int, double>p2(10, 23.4);//创建一个pair,数据为(10,23.4)cout << "p2=(" << p2.first << "," << p2.second << ")" << endl;pair<int, double>p3(p2);//通过p2拷贝构造一个p3p3.first = 100;cout << "p3=(" << p3.first << "," << p3.second << ")" << endl;p1 = p3;//把p3赋值给p1cout << "p1 = p3后" << endl;cout << "p1=(" << p1.first << "," << p1.second << ")" << endl;p3 = make_pair(100, 200);cout << "p3 = make_pair(100,200)后" << endl;//通过get访问p3的成员cout << "p3=(" << get<0>(p3) << "," << get<1>(p3) << ")" << endl;return 0;
}

作为函数参数

pair数对可以作为函数参数,使得函数能够方便地接收一组相关的数据。

#include <iostream>
#include <cmath>
#include <utility>
using namespace std;double distance(pair<double, double> point1, pair<double, double> point2) {double dx = point2.first - point1.first;double dy = point2.second - point1.second;return sqrt(dx * dx + dy * dy);
}int main() {pair<double, double> p1(1.0, 2.0);pair<double, double> p2(4.0, 6.0);cout << "Distance between points: " << distance(p1, p2) << endl;return 0;
}

作为函数返回值

函数也可以返回pair数对,这样就能一次性返回两个相关的结果。

#include <iostream>
#include <utility>
using namespace std;
pair<int, int> MinMax(int* arr, int len)//找到数组的最小值和最大值
{int min = arr[0]; //最小值int max = arr[0];//最大值for (int i = 1; i < len; i++){if (arr[i] < min)min = arr[i];if (arr[i] > max)max = arr[i];}return make_pair(min, max);
}int main()
{int arr[] = { 3,1,8,9,34,2,67,5,70,12,34,65,99,20 };auto p = MinMax(arr, sizeof(arr) / sizeof(arr[0]));cout << "最小值:" << p.first << ",最大值:" << p.second << endl;return 0;
}

pair 数对与 STL 容器的结合

pair 在 vector 中的应用

pair 在 vector 中的应用 vector是 C++ 中常用的动态数组容器,当需要存储一组相关的数对时,vector与pair的结合非常实用。例如,统计单词出现次数的场景:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;vector<pair<string, int>> countWords(const vector<string>& words) {vector<pair<string, int>> wordCount;for (const string& word : words) {auto it = find_if(wordCount.begin(), wordCount.end(),[&word](const pair<string, int>& p) {return p.first == word;});if (it != wordCount.end()) {++(it->second);}else {wordCount.emplace_back(word, 1);}}return wordCount;
}int main() {vector<string> sentence = { "apple", "banana", "apple", "cherry", "banana", "apple" };vector<pair<string, int>> result = countWords(sentence);for (const auto& pair : result) {cout << pair.first << ": " << pair.second << " 次" << endl;}return 0;
}

pair 在 map 中的应用

map是一种关联容器,它以键值对的形式存储数据。实际上,map的内部实现就是基于pair的。map的键和值分别对应pairfirstsecond

#include <iostream>
#include <map>
#include <string>using namespace std;int main() {map<string, int> ageMap;ageMap["Alice"] = 25;ageMap["Bob"] = 30;for (const auto& pair : ageMap) {cout << pair.first << " " << pair.second << "岁" << endl;}return 0;
}

这里ageMap中的每一个元素本质上就是一个pair<string, int>

pair 数对的优势与使用场景

代码简洁性

使用pair数对可以避免创建复杂的自定义结构体来存储两个相关的数据。例如,在简单的坐标表示或键值对存储场景中,pair能极大地简化代码结构,使代码更加易读。

数据关联性

pair明确地表达了两个数据元素之间的关联关系。在函数参数传递和返回值中,使用pair能清晰地表明这两个值是作为一个整体进行处理的,增强了代码的语义性。

算法支持

C++ 标准库中的许多算法,如排序、查找等,都对pair提供了良好的支持。这使得在处理包含pair的容器时,能够方便地利用这些算法进行高效操作。

总结

pair数对作为 C++ 标准库中的一个小巧而强大的工具,为我们在编程过程中处理相关数据提供了便捷的方式。从基本的定义、初始化和访问,到在函数参数、返回值以及与 STL 容器的结合应用,pair数对都展现出了其独特的优势。它不仅能让代码更加简洁明了,还能提升代码的可读性和可维护性。在日常编程中,当你遇到需要处理两个相关数据的场景时,不妨尝试使用pair数对,相信它会为你的编程工作带来意想不到的便利。让我们充分利用pair数对这一强大武器,在 C++ 的编程世界中更加游刃有余地前行。

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

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

相关文章

京东运维面试题及参考答案

目录 OSPF 实现原理是什么? 请描述 TCP 三次握手的过程。 LVS 的原理是什么? 阐述 Nginx 七层负载均衡的原理。 Nginx 与 Apache 有什么区别? 如何查看监听在 8080 端口的是哪个进程(可举例:netstat -tnlp | grep 8080)? OSI 七层模型是什么,请写出各层的协议。 …

输入框输入数字且保持精度

在项目中如果涉及到金额等需要数字输入且保持精度的情况下&#xff0c;由于输入框是可以随意输入文本的&#xff0c;所以一般情况下可能需要监听输入框的change事件&#xff0c;然后通过正则表达式去替换掉不匹配的文本部分。 由于每次文本改变都会被监听&#xff0c;包括替换…

使用 requests 和 BeautifulSoup 解析淘宝商品

以下将详细解释如何通过这两个库来实现按关键字搜索并解析淘宝商品信息。 一、准备工作 1. 安装必要的库 在开始之前&#xff0c;确保已经安装了 requests 和 BeautifulSoup 库。如果尚未安装&#xff0c;可以通过以下命令进行安装&#xff1a; bash pip install requests…

C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题

C#调用ACCESS数据库&#xff0c;解决“Microsoft.ACE.OLEDB.12.0”未注册问题 解决方法&#xff1a; 1.将C#采用的平台从AnyCpu改成X64 2.将官网下载的“Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine_X64”文件解压 3.安装解压后的文件 点击下载安…

【文献阅读】Vision-Language Models for Vision Tasks: A Survey

发表于2024年2月 TPAMI 摘要 大多数视觉识别研究在深度神经网络&#xff08;DNN&#xff09;训练中严重依赖标注数据&#xff0c;并且通常为每个单一视觉识别任务训练一个DNN&#xff0c;这导致了一种费力且耗时的视觉识别范式。为应对这两个挑战&#xff0c;视觉语言模型&am…

【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?

StorageClass 使得用户能够根据不同的存储需求动态地申请和管理存储资源。 StorageClass 定义了如何创建存储资源&#xff0c;并指定了存储供应的配置&#xff0c;例如存储类型、质量、访问模式等。为动态存储供应提供了基础&#xff0c;使得 Kubernetes 可以在用户创建 PVC 时…

Muduo网络库介绍

1.Reactor介绍 1.回调函数 **回调&#xff08;Callback&#xff09;**是一种编程技术&#xff0c;允许将一个函数作为参数传递给另一个函数&#xff0c;并在适当的时候调用该函数 1.工作原理 定义回调函数 注册回调函数 触发回调 2.优点 异步编程 回调函数允许在事件发生时…

Debian编译安装mysql8.0.41源码包 笔记250401

Debian编译安装mysql8.0.41源码包 以下是在Debian系统上通过编译源码安装MySQL 8.0.41的完整步骤&#xff0c;包含依赖管理、编译参数优化和常见问题处理&#xff1a; 准备工作 1. 安装编译依赖 sudo apt update sudo apt install -y \cmake gcc g make libssl-dev …

Git常用问题收集

gitignore 忽略文件夹 不生效 有时候我们接手别人的项目时&#xff0c;发现有的忽略不对想要修改&#xff0c;但发现修改忽略.gitignore后无效。原因是如果某些文件已经被纳入版本管理在.gitignore中忽略路径是不起作用的&#xff0c;这时候需要先清除本地缓存&#xff0c;然后…

编程哲学——TCP可靠传输

TCP TCP可靠传输 TCP的可靠传输表现在 &#xff08;1&#xff09;建立连接时三次握手&#xff0c;四次挥手 有点像是这样对话&#xff1a; ”我们开始对话吧“ ”收到“ ”好的&#xff0c;我收到你收到了“ &#xff08;2&#xff09;数据传输时ACK应答和超时重传 ”我们去吃…

【MediaPlayer】基于libvlc+awtk的媒体播放器

基于libvlcawtk的媒体播放器 libvlc下载地址 awtk下载地址 代码实现libvlc相关逻辑接口UI媒体接口实例化媒体播放器注意事项 libvlc 下载地址 可以到https://download.videolan.org/pub/videolan/vlc/去下载一个vlc版本&#xff0c;下载后其实是vlc的windows客户端&#xff0…

pulsar中的延迟队列使用详解

Apache Pulsar的延迟队列支持任意时间精度的延迟消息投递&#xff0c;适用于金融交易、定时提醒等高时效性场景。其核心设计通过堆外内存索引队列与持久化分片存储实现&#xff0c;兼顾灵活性与可扩展性。以下从实现原理、使用方式、优化策略及挑战展开解析&#xff1a; 一、核…

单链表的实现 | 附学生信息管理系统的实现

目录 1.前言&#xff1a; 2.单链表的相关概念&#xff1a; 2.1定义&#xff1a; 2.2形式&#xff1a; 2.3特点&#xff1a; 3.常见功能及代码 &#xff1a; 3.1创建节点&#xff1a; 3.2头插&#xff1a; 3.3尾插&#xff1a; 3.4头删&#xff1a; 3.5尾删&#xff1a; 3.6插入…

java实用工具类Localstorage

public class LocalStorageUtil {//提供ThreadLocal对象,private static ThreadLocal threadLocalnew ThreadLocal();public static Object get(){return threadLocal.get();}public static void set(Object o){threadLocal.set(o);}public static void remove(){threadLocal.r…

LLM-大语言模型浅谈

目录 核心定义 典型代表 核心原理 用途 优势与局限 未来发展方向 LLM&#xff08;Large Language Model&#xff09;大语言模型&#xff0c;指通过海量文本数据训练 能够理解和生成人类语言的深度学习模型。 核心定义 一种基于深度神经网络&#xff08;如Transformer架…

【小兔鲜】day03 Home模块与一级分类

【小兔鲜】day03 Home模块与一级分类 1. Home-整体结构搭建和分类实现1.1 页面结构 2. Home-banner轮播图功能实现 1. Home-整体结构搭建和分类实现 1.1 页面结构 分类实现 2. Home-banner轮播图功能实现 轮播图实现 在HomeBanner.vue中写出轮播图的结构 在apis目录下新建h…

C++中的多态和模板

#include <iostream> #include <cstdlib> #include <ctime> #include <string>using namespace std;// 武器基类 class Weapon { public:virtual ~Weapon() {}virtual string getName() const 0; // 获取武器名称virtual int getAtk() const 0; …

Spring 概念

Spring 是一个功能强大、灵活且广泛使用的 Java 企业级开发框架&#xff0c;它诞生于 2003 年&#xff0c;由 Rod Johnson 创建&#xff0c;初衷是简化 Java EE 的开发过程。 一、Spring 是什么&#xff1f; 简单来说&#xff1a; Spring 是一个轻量级的 Java 开发框架&#…

神经网络之损失函数

引言&#xff1a;损失函数 &#xff08;Loss Function&#xff09;是机器学习和深度学习中非常重要的一个概念。用于衡量模型的预测值与真实值之间的差异&#xff0c;从而指导模型优化其参数以最小化这种差异。 一、损失函数作用 量化误差&#xff1a;损失函数是将预测值和真实…

Java 基础-32-枚举-枚举的应用场景

在Java编程中&#xff0c;枚举&#xff08;Enum&#xff09;提供了一种强大的方式来定义一组固定的常量。它们不仅限于简单的用途&#xff0c;还可以包含构造函数、方法和字段等高级功能&#xff0c;使其适用于多种不同的应用场景。本文将探讨几种常见的使用枚举的场景&#xf…