【C++ STL】 容器详解:pair 学习

news2025/3/13 13:13:05

在 C++ STL(标准模板库)中,pair 是一个 简单的键值对数据结构,用于存储 两个相关联的值,将两个值组合成一个单元,可以是相同或不同类型。它常用于 返回多个值、存储映射关系、排序 等场景。

1. pair 的基本特点

  • 存储两个值,可以是不同类型。

  • 支持比较运算(按 第一个元素 比较,若相同则比较第二个元素)。

  • 适用于存储键值对或返回多个值

2. pair 的基本用法

2.1 pair 的定义与初始化

// 默认构造函数
pair<int, string> p1;

// 带参数的构造函数
pair<int, string> p2(10, "Hello");

// 使用make_pair函数
auto p3 = make_pair(20, "World");
//auto 自动识别类型pair<int, string>
#include <iostream>
#include <utility>  // 包含 pair
using namespace std;

int main() {
    pair<int, string> p1(1, "Apple");
    pair<int, string> p2 = {2, "Banana"};
    
    cout << "p1: (" << p1.first << ", " << p1.second << ")\n";
    scout << "p2: (" << p2.first << ", " << p2.second << ")\n";
    
    return 0;
}

输出:

p1: (1, Apple)
p2: (2, Banana)
pair的内部实现

pair的实现非常简单,它是一个结构体模板,包含两个公有成员firstsecond。以下是pair的简化实现:

template <class T1, class T2>
struct pair {
    T1 first;
    T2 second;

    // 默认构造函数
    pair() : first(T1()), second(T2()) {}

    // 带参数的构造函数
    pair(const T1& x, const T2& y) : first(x), second(y) {}

    // 拷贝构造函数
    template <class U1, class U2>
    pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
};

2.2 访问 pair 的元素

pair成员firstsecond可以直接访问

cout << p1.first << " " << p1.second << endl;

2.3 使用 make_pair() 进行初始化

pair<int, double> p = make_pair(10, 3.14);

3. pair 在 STL 容器中的应用

3.1 pair 作为 map 的元素

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int, string> mp;
    mp.insert(pair<int, string>(1, "One"));
    mp.insert(make_pair(2, "Two"));
    
    for (auto &p : mp) {
        cout << p.first << ": " << p.second << endl;
    }
    return 0;
}

3.2 pair 作为 vector 的元素

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<pair<int, string>> v;
    v.push_back({1, "Alice"});
    v.push_back({2, "Bob"});
    
    for (auto &p : v) {
        cout << p.first << " " << p.second << endl;
    }
    return 0;
}

3.3 返回多个值

当函数需要返回多个值时,可以使用pair。例如,一个函数可以返回一个pair,其中包含计算结果和状态信息。

#include <iostream>
#include <utility>
using namespace std;

pair<int, bool> divide(int a, int b) {
    if (b == 0) {
        return make_pair(0, false);  // 返回错误状态
    }
    return make_pair(a / b, true);  // 返回结果和成功状态
}

int main() {
    auto result = divide(10, 2);
    if (result.second) {
        cout << "Result: " << result.first << endl;
    } else {
        cout << "Error: Division by zero" << endl;
    }
    return 0;
}

输出:

Result: 5

3.4 作为容器元素

pair可以作为容器的元素,例如vector<pair<int, int>>,用于存储一组相关联的值。

#include <iostream>
#include <vector>
#include <utility>
using namespace std;

int main() {
    vector<pair<int, int>> vec;
    vec.push_back(make_pair(1, 10));
    vec.push_back(make_pair(2, 20));

    for (const auto& p : vec) {
        cout << "First: " << p.first << ", Second: " << p.second << endl;
    }
    return 0;
}

//First: 1, Second: 10
//First: 2, Second: 20

4. pair 的比较规则

pair字典序 进行比较:pair支持比较操作(==!=<<=>>=)。

  1. 先比较 first,小者优先。

  2. first 相等,则比较 second

示例:

pair<int, int> a = {1, 5};
pair<int, int> b = {1, 3};
if (a > b) {
    cout << "a 更大" << endl;
} else {
    cout << "b 更大" << endl;
}

输出:

a 更大

5. pairtuple 的区别

特性pairtuple
元素个数2任意个
访问方式.first .secondget<n>(tuple)
适用场景键值对、映射关系多个不同类型的数据

6. 总结

pair 是 C++ STL 中 存储两个相关值的简单工具,可广泛用于 映射、排序、返回多个值 等场景。掌握 pair 及其 STL 结合使用方式,可以提高代码的 简洁性可读性

pair最常见的用途是存储键值对。例如,在mapunordered_map中,每个元素都是一个pair,其中first是键,second是值。

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int, string> myMap;
    myMap.insert(make_pair(1, "Apple"));
    myMap.insert(make_pair(2, "Banana"));

    for (const auto& p : myMap) {
        cout << "Key: " << p.first << ", Value: " << p.second << endl;
    }
    return 0;
}
Key: 1, Value: Apple
Key: 2, Value: Banana

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

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

相关文章

Go红队开发—web网络编程

文章目录 web网络编程Req快速请求 调试DevModeDebugLogTraceInfo瓶颈分析 控制请求与响应控制请求的字段内容控制调试打印的内容分开dump请求与响应部分请求体设置 作用范围级别设置参数查询URL 路径参数表单请求设置请求头设置 判断响应状态码解析数据SetSuccessResultgjson响…

轻量级模块化前端框架:快速构建强大的Web界面

轻量级模块化前端框架&#xff1a;快速构建强大的Web界面 在当今快节奏的Web开发环境中&#xff0c;选择一个高效且灵活的前端框架至关重要。UIkit 是一个轻量级的模块化前端框架&#xff0c;旨在帮助开发者快速构建功能强大且响应迅速的Web界面。 UIkit提供了丰富的组件和工…

qt+opengl 播放yuv视频

一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

5G基本概念

作者:私语茶馆 1. 5G应用场景概述 1.1.5G应用场景 ITU域2015年定义了三大应用场景:eMBB(增强型移动宽带)、uRLLC(低时延高可靠通信)、mMTC(海量物联网通信); emBB:Enhanced Mobile Broadband ,移动互联网应用,是4G MBB(移动宽带)的升级,主要侧重于网络速率、带…

PH热榜 | 2025-03-12

1. Fluently 标语&#xff1a;开始说英语&#xff0c;就像说你的母语一样流利。 介绍&#xff1a;想象一下&#xff0c;有一个像人类一样的英语教练&#xff0c;全天候在线、价格却便宜15倍。这就是 Fluently &#x1f680; 纠正你的错误&#xff0c;提升你的词汇量、发音和语…

Python Web项目的服务器部署

一.部署运行 1.虚拟环境的安装&#xff1a;&#xff08;一行一行运行&#xff09; wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh bash miniconda.sh -b -p /opt/miniconda3 echo export PATH"/opt/miniconda3/bin:$PAT…

[项目]基于FreeRTOS的STM32四轴飞行器: 八.遥控器摇杆

基于FreeRTOS的STM32四轴飞行器: 八.遥控器摇杆 一.摇杆数据的扫描二.处理摇杆数据三.微调按键处理 一.摇杆数据的扫描 下面摇杆初始化时&#xff0c;启动了ADC-DMA进行了采集&#xff0c;已经开始转换直接将数据通过DMA存入buff数组中&#xff1a; static uint16_t buff[4] …

附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf

《2024 OWASP Top 10 基础设施安全风险》报告&#xff0c;由OWASP&#xff08;开放网络应用安全项目&#xff09;发布&#xff0c;旨在提升企业和组织对基础设施安全风险、威胁与漏洞的意识&#xff0c;并提供高质量的信息和最佳实践建议。报告列出了2024年最重要的10大基础设施…

Pytorch的一小步,昇腾芯片的一大步

Pytorch的一小步&#xff0c;昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息&#xff1a;PyTorch最新2.1版本宣布支持华为昇腾芯片&#xff01; 1、 发生了什么事儿&#xff1f; 在2023年10月4日PyTorch 2.1版本的发布博客上&#xff0c;PyTorch介绍的beta版本…

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中&#xff0c;安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险&#xff0c;因此&#xff0c;对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…

《A Gentle Introduction to Graph Neural Networks》-GNN的综述性论文

目录 一、什么数据可以表示成一张图 &#xff08;1&#xff09;什么是图&#xff1f; &#xff08;2&#xff09;如何表示图的属性 &#xff08;3&#xff09;images as graphs&#xff08;将图片表示为图&#xff09; &#xff08;4&#xff09;text as graphs&#xff08…

[023-01-40].第40节:组件应用 - OpenFeign与 Sentinel 集成实现fallback服务降级

SpringCloud学习大纲 一、需求说明&#xff1a; 需求1&#xff1a;通过fallback属性进行统一配置 a.问题分析&#xff1a; 1.需要实现cloudalibaba-consumer-nacos-order83模块通过OpenFeign调用cloudalibaba-provider-payment9001 83服务通过OpenFeign调用 9001微服务&…

设计模式-结构型模式-装饰器模式

概述 装饰器模式 : Decorator Pattern : 是一种结构型设计模式. 作用 &#xff1a; 允许你动态地给对象添加功能或职责&#xff0c;而无需修改其原始类的代码,非常的符合 开闭原则。 实现思路 &#xff1a;通过创建一个包装对象&#xff08;即装饰器&#xff09;&#xff0c;来…

visual studio配置opencv

文章目录 step1 下载opencvstep2 配置包含目录step 3 配置链接器step4 配置环境变量并重启vs2022step5 检查代码 step1 下载opencv 下载 opencv-4.8.0-windows.exe https://cloud.189.cn/web/share?codefUnqEb7naUra step2 配置包含目录 step 3 配置链接器 step4 配置环境变…

docker修改daemon.json文件后无法启动

1.问题描述 使用阿里云docker镜像安装的docker&#xff0c;安装成功后默认可以启动。但是修改daemon.json配置后docker服务无法启动&#xff0c;提示如下错误&#xff1a; 从上图发现&#xff0c;docker服务默认使用阿里docker镜像仓库 2.解决方法 根据提示找到docker服务目…

Linux网络:网络与操作系统1

本文是介绍网络的基本结构&#xff0c;以及和OS之间有什么关系 OSI七层模型 引入 使用网络是为了解决信息的长距离传送&#xff0c;那就需要解决四个问题&#xff1a; 接收方如何使用数据传输的可靠性主机如何定位数据包在局域网如何转发 人们选择用网络协议&#xff08;t…

姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗

《仁心俱乐部》在芒果 TV 播出&#xff0c;湖南卫视金鹰独播剧场也随之播出&#xff0c;这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜&#xff0c;她为患者检查身体时动作娴熟&#xff0c;与患者沟通时展现出的耐心和专注&#xff0c;都展现出很高的专业…

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…

51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版

前言&#xff1a;本文主要围绕 51 单片机最小系统的绘制及程序模板创建展开。首先介绍了使用 Proteus 绘制 51 单片机最小系统的详细步骤&#xff0c;包括软件安装获取途径、工程创建、器件添加&#xff08;如单片机 AT89C51、晶振、电容、电阻、按键等&#xff09;、外围电路&…

使用 pytesseract 进行 OCR 识别:以固定区域经纬度提取为例

引言 在智能交通、地图定位等应用场景中&#xff0c;经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 Python 的 pytesseract 库结合 PIL 对图像进行预处理&#xff0c;通过固定区域裁剪&#xff0c;来有效地识别出图像上显示的经纬度信息。 1. OCR 与 …