目录
我也从没想过STL中的pair还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!
前言
这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!那么事不宜迟,我们马上开始吧!
一、pair的基本介绍
1.简要介绍
在C++中,pair是一个模板类,用于表示一对值的组合,它位于<utlity.h>头文件中,我们在实际使用时只需引入万能头文件<bits/stdc++.h>即可。
pair类有两个模板参数,分别表示第一个值和第二个值。对于pair类,你可以直接使用默认构造函数来构造一个pair对象,也可以运用带参数的构造函数。代码如下:
pair<int, string> pa(100, "Tobu");
同时pair类还对==和!=进行了运算符重载。
2.使用方法
使用pair类可以方便地将两个值组合在一起,并进行传递、存储和操作。例如,你可以将两个整数组合在一起作为函数的返回值,或者将这一对值存储在容器中。
3.使用示例
示例代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
pair<string, int> student("Mike", 15); //学生的姓名和年龄
pair<char, string> score('A', "perfect"); //学生的等第和老师的评价
cout << "Name: " << student.first << ", " << "Age: " << student.second << endl;
cout << "Level: " << score.first << ", " << "judgement: " << score.second << endl;
return 0;
}
pair是一个类,可以通过.first和.second的形式来访问第一和第二个成员变量。
二、pair的嵌套
pair可以进行嵌套,也就是说可以将一个pair对象作为另一个pair对象的成员,通过这一方式,我们可以方便地组合多个值,并形成更复杂的数据结构。例如,可以创建一个pair对象存储x坐标和y坐标,再与另一个z坐标构成新的pair对象。
我们可以写一段代码,求出两个三维空间点之间的距离。代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
pair<pair<int, int>, int> p1({1, 1}, 2);//第一个点p1(1,1,2)
pair<pair<int, int>, int> p2({1, 2}, 1);//第二个点p2(1,2,1)
double d,sum;//理论计算d = 根号2
//算三个坐标差的平方和
double dx = (double)(p1.first.first - p2.first.first)*(p1.first.first - p2.first.first);
double dy = (double)(p1.first.second - p2.first.second) * (p1.first.second - p2.first.second);
double dz = (double)(p1.second - p2.second) * (p1.second - p2.second);
sum = dx + dy + dz;
d = (double)sqrt(sum);
cout << d << endl;
return 0;
}
结果是1.41421,的确是根号2(近似值)。
我们在设置点p1和p2时,还可以使用make_pair()函数。代码如下:
pair<pair<int, int>, int> p1(make_pair(1, 1), 2);//第一个点p1(1,1,2)
pair<pair<int, int>, int> p2(make_pair(1, 2), 1);//第二个点p2(1,2,1)
三、pair自带排序规则
1.内部机制
pair自带的排序规则是按照first成员变量进行升序排序。如果first成员变量相等,则按照second成员变量进行升序排序。使用标准库中的排序算法(如sort()函数)也是如此。
下面是一段代码示例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
vector<pair<int, int>> vec;
vec.push_back({ 3,2 });
vec.push_back({ 1,4 });
vec.push_back({ 2,1 });
sort(vec.begin(),vec.end());
for (auto i : vec)cout << i.first << ", " << i.second << endl;
return 0;
}
结果为:
1, 4
2, 1
3, 2
若想按照其他规则进行排序,可以参考我的这一篇文章,里面有着详细的介绍:
https://blog.csdn.net/ConquerObstacles/article/details/134428470