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;
}

输出:

相关推荐
地平线开发者5 小时前
profiler debug 工具用法与高一致性策略
算法·自动驾驶
编程大师哥5 小时前
匿名函数 lambda + 高阶函数
java·python·算法
isyangli_blog5 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008116 小时前
FastAPI APIRouter
开发语言·python
Benszen6 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆6 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木6 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
我叫袁小陌6 小时前
算法解题思路指南
算法
MC皮蛋侠客6 小时前
C++17 多线程系列(五):C++17 并行算法——从串行到并行的零成本迁移
c++·多线程
地平线开发者6 小时前
Conv+BN+Add+ReLU 融合机制简介
算法·自动驾驶