C 进阶pair容器
终极管理员 知识笔记 125阅读
个人主页Weraphael
✍作者简介目前学习C和算法
✈️专栏C航路
希望大家多多支持咱一起进步
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注✨
目录 一、什么是pair二、pair的初始化三、pair的大小比较四、make_pair函数

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

#include <string>struct Student{std::string _name; // 名字int _id; // 学号};
像这样只打包两种数据我们就可以使用std::pair
。pair
的中文意思一对也就是说它只能保存一对数据
pair
是C已经定义好的结构体同时也是一个类模板并且使用前需要加上头文件<utility>
【pair部分源码】
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
有两个公有成员变量分别是first
和second
。并且它们可以直接在类外被使用。
【声明方式】
类模板实例化对象需要加上<>
std::pair<第一个数据类型,第二个数据类型> 变量名
接下来我用代码演示 一下刚才的学生结构体
#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
常见的初始化是以上第一种和第二种分别是默认构造和拷贝构造
first
和second
的值是0
如果是string
就是空字符串 除此之外还有第三种初始化方式 std::pair<类型1, 类型2> 变量名(第一个数据的初始值, 第二个数据的初始值);// 对应的类型一定要匹配
【代码演示】
#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
内部已经实现过比较大小运算符重载了
#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
对象
【代码样例】
#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到C17结构体创建对象的代码一直都在简化。我们可以看C98是如何简化pair
创建对象的代码的
long long
类型的变量现需要通过一个打印函数将这两个变量打包成pair
后再打印 如果不使用make_pair
函数就会写出以下代码
#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
函数后以上代码就会简化很多
#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
容器打基础