个人主页:@Weraphael
✍作者简介:目前学习C++和算法
✈️专栏:C++航路
希望大家多多支持,咱一起进步!
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注✨
假设我想打包两种数据,第一个是学生的姓名,第二个是学生的学号,我们就可以写出如下结构体:
#include
struct Student
{
std::string _name; // 名字
int _id; // 学号
};
像这样只打包两种数据,我们就可以使用std::pair
。pair
的中文意思一对,也就是说它只能保存一对数据
pair
是C++已经定义好的结构体,同时也是一个类模板,并且使用前需要加上头文件
【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
#include
#include
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
常见的初始化是以上第一种和第二种,分别是默认构造和拷贝构造
first
和second
的值是0
(如果是string
就是空字符串)std::pair<类型1, 类型2> 变量名(第一个数据的初始值, 第二个数据的初始值);
// 对应的类型一定要匹配!!!
【代码演示】
#include
#include
#include
int main()
{
std::pair<std::string, int> p("Weraphael", 18);
std::cout << "姓名:" << p.first << std::endl;
std::cout << "年龄:" << p.second << std::endl;
return 0;
}
【程序结果】
它们的比较顺序是这样的:首先先比较first
成员变量,如果相等就会比较second
注意:pair
内部成员的类型不一样的两个对象不能比较大小!!!
【代码验证】
pair
内部已经实现过比较大小运算符重载了
#include
#include
#include
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
函数接收两个参数,然后它会将这两个参数来创建pair
对象
【代码样例】
#include
#include
#include
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
函数,就会写出以下代码
#include
#include
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
#include
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
容器打基础!!!