【C++进阶】pair容器

👦个人主页:@Weraphael

✍🏻作者简介:目前学习C++和算法

✈️专栏:C++航路

🐋 希望大家多多支持,咱一起进步!😁

如果文章对你有帮助的话

欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

一、什么是pair

假设我想打包两种数据,第一个是学生的姓名,第二个是学生的学号,我们就可以写出如下结构体:

bash 复制代码
#include <string>

struct Student
{
	std::string _name; // 名字
	int _id; // 学号
};

像这样只打包两种数据 ,我们就可以使用std::pairpair的中文意思一对,也就是说它只能保存一对数据

pair是C++已经定义好的结构体,同时也是一个类模板 ,并且使用前需要加上头文件<utility>

【pair部分源码】

bash 复制代码
template <class T1, class T2>
struct pair
{
	typedef T1 first_type;
	typedef T2 second_type;
	
	T1 first;
	T2 second;
	pair(): first(T1()), second(T2())
	{}
	pair(const T1& a, const T2& b): first(a), second(b)
	{}
}

通过以上源码我们发现:pair有两个公有成员变量 ,分别是:firstsecond。并且它们可以直接在类外被使用。

【声明方式】

类模板实例化对象需要加上<>

bash 复制代码
std::pair<第一个数据类型,第二个数据类型> 变量名

接下来我用代码演示 一下刚才的学生结构体

bash 复制代码
#include <iostream>
#include <utility>
#include <string>

int main()
{
    // 第一个数据类型为string,表示学生的姓名
    // 第二个数据类型为int,表示学生的学号
    std::pair<std::string, int> stu;

    stu.first = "Weraphael";
    stu.second = 2022;

    std::cout << "姓名:" << stu.first << std::endl;
    std::cout << "学号:" << stu.second << std::endl;

    return 0;
}

【运行结果】

二、pair的初始化

pair常见的初始化是以上第一种和第二种,分别是默认构造和拷贝构造

  • 注意:如果使用默认构造函数初始化,其成员变量firstsecond的值是0(如果是string就是空字符串)
  • 除此之外,还有第三种初始化方式
bash 复制代码
std::pair<类型1, 类型2> 变量名(第一个数据的初始值, 第二个数据的初始值);
// 对应的类型一定要匹配!!!

【代码演示】

bash 复制代码
#include <iostream>
#include <utility>
#include <string>

int main()
{
    std::pair<std::string, int> p("Weraphael", 18);

    std::cout << "姓名:" << p.first << std::endl;
    std::cout << "年龄:" << p.second << std::endl;

    return 0;
}

【程序结果】

三、pair的大小比较

它们的比较顺序是这样的:首先先比较first成员变量,如果相等就会比较second

注意:pair内部成员的类型不一样的两个对象不能比较大小!!!

【代码验证】

pair内部已经实现过比较大小运算符重载了

bash 复制代码
#include <iostream>
#include <utility>
#include <string>

int main()
{
    std::pair<int, std::string> p1(18, "Weraphael");
    std::pair<int, std::string> p2(19, "Weraphael");

    std::cout << "p1是否小于p2:" << (p1 < p2) << std::endl;

    std::pair<int, std::string> p3(18, "zhangsan");
    std::cout << "p1是否小于p3:" << (p1 < p3) << std::endl;

    std::pair<int, std::string> p4(18, "Weraphael");
    std::cout << "p1是否等于p4:" << (p1 == p4) << std::endl;

    return 0;
}

【运行结果】

四、make_pair函数

功能:make_pair函数接收两个参数,然后它会将这两个参数来创建pair对象

【代码样例】

bash 复制代码
#include <iostream>
#include <utility>
#include <string>

int main()
{
    std::pair<int, int> p = std::make_pair(1, 2);

    std::cout << "first:" << p.first << std::endl;
    std::cout << "second:" << p.second << std::endl;

    return 0;
}

【程序结果】

以上我们发现:用了make_pair函数后,代码变长了。但是实际上,make_pair函数是用来简化代码的

从C++到C++17,结构体创建对象的代码一直都在简化。我们可以看C++98是如何简化pair创建对象的代码的:

  • 有两个long long类型的变量,现需要通过一个打印函数,将这两个变量打包成pair后再打印

如果不使用make_pair函数,就会写出以下代码

bash 复制代码
#include <iostream>
#include <utility>

void Print(std::pair<long long, long long> p)
{
    std::cout << "first:" << p.first << std::endl;
    std::cout << "second:" << p.second << std::endl;
}

int main()
{
    long long a = 1;
    long long b = 2;

    Print(std::pair<long long, long long>(a, b));

    return 0;
}

【运行结果】

但是用了make_pair函数后,以上代码就会简化很多

bash 复制代码
#include <iostream>
#include <utility>

void Print(std::pair<long long, long long> p)
{
    std::cout << "first:" << p.first << std::endl;
    std::cout << "second:" << p.second << std::endl;
}

int main()
{
    long long a = 1;
    long long b = 2;

    Print(std::make_pair(a, b));

    return 0;
}

【运行结果】


注:以上知识是为了为map容器打基础!!!

相关推荐
雁于飞2 小时前
vscode中使用git、githup的基操
笔记·git·vscode·学习·elasticsearch·gitee·github
鹅毛在路上了2 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug2 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
rannn_1112 小时前
【Javaweb学习|实训总结|Week1】html基础,CSS(选择器、常用样式、盒子模型、弹性盒布局、CSS定位、动画),js(基本类型、运算符典例)
css·笔记·学习·html
lingchen19062 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
Ro Jace2 小时前
心灵笔记:第一性原理学习与实践
笔记
索迪迈科技2 小时前
基于野火F407开发板实现电源管理-停止模式
c语言·stm32·单片机·嵌入式硬件·mcu
gb42152872 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go3 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
蒋星熠3 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程