STL之pair

目录

pair的定义和结构

示例

pair的嵌套

示例

pair自带排序规则

示例

代码示例


pair的定义和结构

在c++中,pair是一个模板类,用于表示一对值的组合。它位于<utility>头文件中。pair类的定义如下:

cpp 复制代码
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类,可以方便的将两个值组合在一起,并进行传递、存储和操作。

例如,可以将两个整数组合在一起作为函数的返回值,或者将一对值存储在容器中。

示例

cpp 复制代码
#include<iostream>
#include<utility>
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;
}

输出结果:

1,3.14

a,hello

pair的嵌套

pair可以进行嵌套,也就是说可以将一个pair对象作为另一个pair对象的成员。通过嵌套pair,你可以方便地组合多个值,并形成更复杂的数据结构。

例如,你可以创建一个三维坐标系的点,其中第1个维度由一个整数表示,第2、3个维度由一个pair表示。

示例

cpp 复制代码
#include<iostream>
#include<utility>
using namespace std;
int main()
{
	pair<int, double>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(8, 9));
	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 << ',' << p3.second.second << endl;
	return 0;
}

运行结果:

cpp 复制代码
1,2
3,4,5
6,7,8,9

pair自带排序规则

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

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

这意味着如果当你使用标准库中的排序算法(如std::sort)对包含pair对象的容器进行排序时,会根据pair对象的first成员进行排序。

示例

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
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& i : vec)
	{
		cout << i.first << ',' << i.second << endl;
	}
	return 0;

运行结果:

cpp 复制代码
1,4
2,1
3,2

代码示例

cpp 复制代码
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
//定义一个结构体,表示一个人的信息
struct Person
{
	string name;
	int age;
};

int main()
{
	//创建一个存储Person对象的向量
	vector<Person>people;
	
	//添加一些Person对象到向量中
	people.push_back({"张三",25});
	people.push_back({"李四",30});
	people.push_back({"王五",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 << ", Age:" << pair.first.age << ",Score:" << pair.second << endl;
	}
	return 0;
}

结果:

cpp 复制代码
Name:张三, Age:25,Score:90
Name:李四, Age:30,Score:85
Name:王五, Age:20,Score:95
相关推荐
MSTcheng.3 分钟前
【C++进阶】继承(下)——挖掘继承深处的奥秘!
开发语言·c++
学困昇4 分钟前
Linux基础开发工具(上):从包管理到“进度条”项目实战,掌握 yum/vim/gcc 核心工具
linux·运维·开发语言·数据结构·c++·vim
时间的情敌7 分钟前
Vue3 和 Vue2 的核心区别
前端·javascript·vue.js
533_8 分钟前
[antv x6] 限制节点/边是否可以移动,移动时返回父节点,限制节点的移动范围
前端
步步为营DotNet11 分钟前
深入理解ASP.NET Core Middleware:构建高效Web应用的管道基石
前端·后端·asp.net
Aevget12 分钟前
DevExtreme JS & ASP.NET Core v25.2新功能预览 - 提升AI扩展功能
javascript·人工智能·ui·asp.net·界面控件·devextreme
|晴 天|12 分钟前
微前端架构入门:从概念到落地实践
前端·架构
春卷同学13 分钟前
电子蛇对战 - Electron for 鸿蒙PC项目实战案例
javascript·electron·harmonyos
ALex_zry14 分钟前
Rust语言基础分析与C++对比:系统编程的现代演进
java·c++·rust
Molesidy16 分钟前
【QT】【C++】基于QT的多线程分别管理GUI和运算任务
开发语言·c++·qt