蓝桥杯省赛无忧 STL 课件11 pair

01 pair的定义和结构

在C++中,pair是一个模板类,用于表示一对值的组合,它位于头文件中。

pair类的定义如下:

csharp 复制代码
template<class T1,class T2>
	struct pair{
		T1 first;//第一个值
		T2 second;//第二个值
	// 构造函数
	pair();
	pair(const T1& X, const T2& y);
	
	//比较运算符重载
	bool operator==(const pair& rhs) const;
	bool operator!=(const pair& rhs) const;

    //其他成员函数和特性
	// ... 
	};

pair类模板有两个模板参数,T1和T2,分别表示第一个值和第二个值的类型。

pair类有两个成员变量,first和second,分别表示第一个值和第二个值。

pair类还有一些成员函数和特性,例如默认构造函数、带参数的构造函数、比较运算符重载等。

使用pair类,你可以方便地将两个值组合在一起,并进行传递、存储和操作。

例如,可以将两个整数组合在一起作为函数的返回值,或者将一对值存储在容器中。
下面是一些使用pair的示例

csharp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	pair<int,double> p1(1,3.14);
	pair<char,string> p2('a',"hello");
	cout<<p1.first<<","<<p1.second<<endl;
	cout<<p2.first<<","<<p2.second<<endl;
	return 0;
}

02 pair的嵌套

pair可以进行嵌套,也就是说可以将一个pair对象作为另一个pair对象的成员。

通过嵌套pair,你可以方便地组合多个值,并形成更复杂的数据结构。例如,你可以创建一个三维坐标系的点,其中第1个维度由一个整数表示,第2、3个维度由一个pair表示。
下面是一个示例代码,演示了如何嵌套使用pair:

csharp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	pair<int,int> p1(1,2);
	pair<int,pair<int,int>> p2(3,make_pair(4,5));
	pair<pair<int,int>,pair<int,int>> p3(make_pair(6,7),make_pair(3,4));
	cout<<p1.first<<","<<p1.second<<endl;
	cout<<p2.first<<","<<p2.second.first<<","<<p2.second.second<<endl;
	cout<<p3.first.first<<","<<p3.first.second<<","<<p3.second.first<<","<<endl;
	return 0;
}

在这个示例中,我们创建了三个pair对象:p1、p2和p3.
·p1是一个简单的pair,包含两个整数值。
·p2是一个嵌套的pair,其中第一个值是一个整数,第二个值是一个pair,其中包含两个整数值。
·p3是一个嵌套的pair,其中每个值都是一个pair,每个pair包含两个整数值。

通过访问嵌套的pair对象的成员变量,我们可以获取到相应的值。

03 pair自带排序规则

pair自带的排序规则是按照first成员进行升序排序。

如果first成员相等,则按照second成员进行升序排序。

这意味着当你使用标准库中的排序算法(如sort)对包含pair对象的容器进行排序时,会根据pair对象的first成员进行排序。
下面是一个示例代码,演示了如何使用par进行排序:

csharp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<pair<int,int>> vec;
	vec.push_back(make_pair(3,2));
	vec.push_back(make_pair(1,4));
	vec.push_back(make_pair(2,1));
	
	sort(vec.begin(),vec.end());
	for(const auto& p : vec){
		cout<<p.first<<","<<p.second<<endl;
	} 
	return 0;
}

在这个示例中,我们创建了一个存储pair对象的向量vec,其中包含三个pair对象,

然后,我们使用sort函数 对vec进行排序。由于pair对象的排序规则是按照first成员进行升序排序,所以排序后的结果是

最后,我们通过遍历vec 并输出每个pair 对象的成员,验证了排序结果。

需要注意的是,如果你想按照其他排序规则对pair进行排序,可以自定义比较函数或使用lambda表达式来传递给排序算法。这样,你可以根据自己的需求定义排序规则.

04 代码示例

csharp 复制代码
#include<bits/stdc++.h>
using namespace std;
//定义一个结构体,表示一个人的信息
struct Person{
	string name;
	int age;
}; 
int main(){
//创建一个存储Person对象的向量
	vector<Person> people;
//添加一些Person对象到向量中
	people.push_back({"Alice",25});
	people.push_back({"Bob",30});
	people.push_back({"Charlie",20});
//创建一个存储pair的向量,每个pair包含一个Person对象和一个评分
	vector<pair<Person,int>> scores;
//添加一些pair到向量中
	scores.push_back({people[0],90});
	scores.push_back({people[1],85});
	scores.push_back({people[2],95});
//遍历pair向量,并输出每个人的姓名、年龄和评分
for(const auto& pair:scores){
	cout<<"Name: "<<pair.first.name<<endl;
	cout<<"Age: "<<pair.first.age<<endl;
	cout<<"Score: "<<pair.second<<endl;
	cout<<endl;
} 
	return 0;
}
相关推荐
AI科技星1 分钟前
引电统一方程:严格推导与量纲零错误验证
人工智能·算法·机器学习·架构·学习方法
壹号用户6 分钟前
C++入门(引用)
数据结构·c++
lcj251115 分钟前
【list】手撕C++ list!从0到1实现双向链表,迭代器、const迭代器、模板全解析,面试官都惊呆了!
c++·笔记·链表·list
8Qi829 分钟前
LeetCode 518:零钱兑换 II(Coin Change II)—— 题解 ✅
java·算法·leetcode·动态规划·完全背包
计算机安禾29 分钟前
【算法分析与设计】第49篇:算法博弈论与机制设计
人工智能·算法·机器学习
玖釉-37 分钟前
Vulkan Specialization Constants 详解:在“运行时配置”和“编译期优化”之间取得平衡
c++·windows·图形渲染
05候补工程师44 分钟前
【408 数据结构】图论核心算法(拓扑/关键路径)与二叉搜索树精髓夺分笔记
数据结构·经验分享·笔记·考研·算法·图论
AC赳赳老秦1 小时前
OpenClaw+MySQL 深度应用:自动生成建表语句、索引优化建议与数据迁移脚本
开发语言·数据库·人工智能·python·mysql·算法·openclaw
奔袭的算法工程师1 小时前
论文解读--BEV-radar:: bidirectional radar-camera fusion for 3D object detection
人工智能·算法·目标检测·计算机视觉·自动驾驶·信号处理
-FxYaM-1 小时前
【UE】渲染框架学习路径-初次修改源码
服务器·网络·c++·windows·ue5·unreal engine