STL(一)(pair篇)

1.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类,可以方便地将两个值组合在一起,并进行传递、存储和操作,例如:可以将两个整数组合在一起作为函数的返回值,或者将一对值存储在容器中

pair的示例:

cpp 复制代码
#include<iostream>
#include<utility>
int main(){
	std::pair<int,double>p1(1,3.14);
	std::pair<char,std::string>p2('a',"hello");
	
	std::cout<<p1.first<<","<<p1.second<<"\n";
	std::cout<<p2.first<<","<<p2.second<<"\n"; 
}

输出 1,3.14

a,hello

以上代码创建了两个pair对象,分别包含不同类型的值,然后,通过访问first和second成员变量,输出了这些值


2.pair的嵌套

  • pair可以进行嵌套,也就是说可以将一个pair对象作为另一个pair对象的成员
  • 通过嵌套pair,可以方便地组合多个值,并形成更复杂的数据结构
  • 例如:你可以创建一个三维坐标系的点,其中第1个维度由一个整数表示;第2、3个维度由一个pair表示

pair的嵌套示例:

cpp 复制代码
#include<iostream>
#include<utility>
int main(){
	std::pair<int,int>p1(1,2);
	std::pair<int,std::pair<int,int>>p2(3,std::make_pair(4,5));
	std::pair<std::pair<int,int>,std::pair<int,int>>p3(std::make_pair(6,7),std::make_pair(8,9));
	
	std::cout<<p1.first<<","<<p1.second<<"\n";
	std::cout<<p2.first<<","<<p2.second.first<<","<<p2.second.second<<"\n"; 
	std::cout<<p3.first.first<<","<<p3.first.second<<","<<p3.second.first<<","<<p3.second.second<<"\n"; 
}

输出:


3.pair自带排序规则

  • pair自带的排序规则是按照first成员进行升序排序
  • 如果first成员相等,则按照second成员进行升序排序
  • 这意味着当使用标准库中的排序算法(如std::sort)对包含pair对象的容器进行排序时,会根据pair对象的first成员进行排序

pair进行排序的示例:

cpp 复制代码
#include<iostream> 
#include<utility> 
#include<vector> 
#include<algorithm>
int main(){
	std::vector<std::pair<int,int>>vec;
	vec.push_back(std::make_pair(3,2));
	vec.push_back(std::make_pair(1,4));
	vec.push_back(std::make_pair(2,1));
	
	std::sort(vec.begin(),vec.end());
	
	for(const auto& p:vec){
		std::cout<<p.first<<","<<p.second<<"\n";
	}
	return 0;
} 

输出:


4.代码示例:

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

int main(){
	//创建一个储存Person对象的向量
	std::vector<Person>people;
	//添加一些Person对象到向量中
	people.push_back({"Alice",25}); 
	people.push_back({"Bob",30}); 
	people.push_back({"Charlie",20});
	
	//创建一个储存pair动的向量,每一个pair包含一个Person对象和有一个评分
	std::vector<std::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){
		std::cout<<"Name:"<<pair.first.name<<"\n";
		std::cout<<"Age:"<<pair.first.name<<"\n";
		std::cout<<"Score:"<<pair.second<<"\n";
		std::cout<<"\n";
	} 
	return 0;
}

输出:

相关推荐
papership29 分钟前
【入门级-C++程序设计:12、文件及基本读写-文件的基本概念&文本文件的基本操作】
开发语言·c++·青少年编程
SaleCoder1 小时前
用Python构建机器学习模型预测股票趋势:从数据到部署的实战指南
开发语言·python·机器学习·python股票预测·lstm股票模型·机器学习股票趋势
KoiHeng1 小时前
部分排序算法的Java模拟实现(复习向,非0基础)
java·算法·排序算法
玩代码7 小时前
备忘录设计模式
java·开发语言·设计模式·备忘录设计模式
岁忧8 小时前
(nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
java·c++·leetcode·面试·go·散列表
技术猿188702783518 小时前
实现“micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据(一个方法)
开发语言·网络·python·深度学习·测试工具
放飞自我的Coder8 小时前
【colab 使用uv创建一个新的python版本运行】
开发语言·python·uv
SunkingYang8 小时前
MFC/C++语言怎么比较CString类型最后一个字符
c++·mfc·cstring·子串·最后一个字符·比较
界面开发小八哥8 小时前
MFC扩展库BCGControlBar Pro v36.2新版亮点:可视化设计器升级
c++·mfc·bcg·界面控件·ui开发
R-G-B8 小时前
【15】MFC入门到精通——MFC弹窗提示 MFC关闭对话框 弹窗提示 MFC按键触发 弹窗提示
c++·mfc·mfc弹窗提示·mfc关闭弹窗提示·mfc按键触发 弹窗提示