8.14 类模板--pair基本操作与应用


一、类模板

类模板(class template)本身不是一个类,而是可以根据 不同数据类型 产生不同类 的“模板”。在使用时,编译器会根据传入的数据类型产生对应的类,再创建对应实例。

二、pair

std::pair 是标准库中定义的一个类模板。用于将两个变量关联在一起,组成一个==“对”==,而且两个变量的数据类型可以是不同的。

2.1 pair与自定义的 struct

与自定义的 struct 相比,pair 不需要额外定义结构与重载运算符,因此使用起来更加简便。
然而,自定义 struct 的变量命名往往更加清晰(pair 只能使用 first 与 second 访问包含的两个变量)。同时,如果需要将两个以上的变量进行关联,自定义 struct 会更加合适。

2.2 pair的基本操作

/*pair*/
#include<bits/stdc++.h>
using namespace std;
int main(){
	//在定义时直接完成 pair 的初始化
	pair<int,double>p1(1,1.5);
	cout<<p1.first<<' '<<p1.second<<endl;//1  1.5
	//先定义,后赋值的方法完成 pair 的初始化
	pair<int, double> p2;
	p2.first = 2;
	p2.second = 2.0;
	//修改
	p2.second+=0.5;
	cout<<p2.first<<' '<<p2.second<<endl;//2  2.5
	
	//使用 std::make_pair 函数。该函数接受两个变量,并返回由这两个变量组成的 pair
	pair<int,double>p3=make_pair(3,3.5);
	cout<<p3.first<<' '<<p3.second<<endl;//3  3.5
	//使用auto ,以避免显式声明数据类型
	auto p4 = make_pair(4,4.5);
	cout<<p4.first<<' '<<p4.second<<endl;//4  4.5
	
	//比较:pair 已经预先定义了所有的比较运算符
	//先比较两个 pair 中的第一个变量,在第一个变量相等的情况下再比较第二个变量
	if(p1<=p2) cout<<"p1<=p2"<<endl;
	else cout<<"p1>p2"<<endl;//p1<=p2
	
	pair<string, int>p5("Tom", 100);
	pair<string, int>p6("Tom",90);
	pair<string, int>p7("Jerry", 95);
	//p5>p6>p7
	if(p5<=p6) cout<<"p5<=p6"<<endl;
	else cout<<"p5>p6"<<endl;//p5>p6
	
	if(p5<=p7) cout<<"p5<=p7"<<endl;
	else cout<<"p5>p7"<<endl;//p5>p7
	
	if(p6<=p7) cout<<"p6<=p7"<<endl;
	else cout<<"p6>p7"<<endl;//p6>p7
	
	//赋值:将 pair 的值赋给另一个类型一致的 pair
	p4=p1;
	cout<<p4.first<<' '<<p4.second<<endl;//1  1.5
	
	//交换 
	swap(p1,p2);
	cout<<p1.first<<' '<<p1.second<<endl;//2  2.5
	cout<<p2.first<<' '<<p2.second<<endl;//1  1.5
	p2.swap(p1);
	cout<<p1.first<<' '<<p1.second<<endl;//1  1.5
	cout<<p2.first<<' '<<p2.second<<endl;//2  2.5
}

由于 pair 定义了 STL 中常用的 < 与 ==,使得其能够很好的与其他 STL 函数或数据结构配合。比如,pair 可以作为 priority_queue 的数据类型。

priority_queue<pair<int,double> >q;

2.3 pair应用

2.3.1 pair实现离散化

创建一个 pair 数组,将原始数据的值作为每个 pair 第一个变量,将原始数据的位置作为第二个变量。在排序后,将原始数据值的排名(该值排序后所在的位置)赋给该值原本所在的位置即可

// a为原始数据
pair<int, int> a[MAXN];
// ai为离散化后的数据
int ai[MAXN];
for (int i = 0; i < n; i++) {
  // first为原始数据的值,second为原始数据的位置
  scanf("%d", &a[i].first);
  a[i].second = i;
}
// 排序
sort(a, a + n);
for (int i = 0; i < n; i++) {
  // 将该值的排名赋给该值原本所在的位置
  ai[a[i].second] = i;
}

2.3.2 Dijkstra

Dijkstra 算法的堆优化中,可以使用 pair 与 priority_queue 维护节点,将节点当前到起点的距离作为第一个变量,将节点编号作为第二个变量

2.3.2 pair 与 map

map 的是 C++ 中存储键值对的数据结构。很多情况下,map 中存储的键值对通过 pair 向外暴露

map<int,double>mp;
mp.insert(make_pair(2,2,4));
mp.insert(pair<int,double>(3,3.4));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值