C++ STL 优先队列 priority_queue

本文从WordPress迁移而来, 查看全部WordPress迁移文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

struct student{
int a,b,c;
student(){}
student(int aa,int bb,int cc):a(aa),b(bb),c(cc){}
void show(){
printf("%d %d %d\n",a,b,c);
}
//重载<运算符,对应less算子,当使用less算子时才生效
bool operator < (const student &temp)const{
//习惯上,比较的符号和重载的运算符一样,即 a < temp.a 和 < 一样
return a < temp.a; //less对应的是大堆,这样写的结果是按照a从大到小出队
}
//重载>运算符,对应greater算子,当使用greater算子时才生效
bool operator > (const student &temp)const{
//习惯上,比较的符号和重载的运算符一样,即 a > temp.a 和 > 一样
return a > temp.a; //greater对应的是小堆,这样写的结果是按照a从小到大出队
}
};
struct cmp{ //自定义比较算子,是一个struct或者class
bool operator () (const student &x , const student &y)const{ //重载的运算符为()
return x.a > y.a;
}
};

priority_queue<int> pq1; //默认类型int

priority_queue<student> pq2;
//没有说明使用什么比较算子,默认使用less

priority_queue< student , vector<student> , less<student> > __pq2;
//声明使用less算子,必须重载<运算符,因为student是自定义类型

priority_queue< student , vector<student> , greater<student> > pq2__;
//声明使用greater算子,必须重载>运算符,因为student是自定义类型

priority_queue< student , vector<student> , cmp > __pq2__;
//使用完全自定义的比较算子

priority_queue< student , vector<student> > PQ2;
//不写第3个参数

/*
PQ的模板声明带有3个参数
priority_queue<Type,Container,Functional>
Type为数据类型
Container为保存数据的容器
Functional为元素的比较方式(比较算子)
# Container必须是用数组实现的容器,比如vector,dequeue但不能用list

关于参数
1.PQ的第一个参数是必须的,即student
2.后面的两个参数可以不写,不写的话,第2个参数默认vector,第3个参数默认是less
3.当然,你可以写了第1,第2个参数,第3个参数不写,默认使用less
4.但是!你不能写了第1个,第3个参数,却不写第2个参数!
5.全部都写是一个好习惯
6.当这个PQ比较简单的时候,只写第1个参数是个不错的选择
*/

int main(){
//插入数据来测试吧
return 0;
}