目录
一、类模板
类模板(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));