(个人STL相关的博客目录:https://blog.csdn.net/Kprogram/article/details/90408011)node
(priority_queue-c++官网:http://www.cplusplus.com/reference/queue/priority_queue/)c++
(什么是队列以及普通队列的用法移步这里:https://blog.csdn.net/Kprogram/article/details/82054436)数组
优先队列是一种特殊的队列,普通队列是先进先出,而优先队列是取队列中最小或最大的元素先出。数据结构
本文涉及优先队列两种基本的用法:函数
1.使用C++自带的数据(如int),字体
2.使用本身构造的数据结构。优化
#include <queue> using namespace std;
typename指的是队列内数据类型,能够是 int, double等等等等,但因为须要分出谁大谁小,因此数据类型必须具备可比性。spa
name 是你构建的队列的名字,符合变量命名法则就行。.net
例:构建一个 int 类型的优先队列, 名字叫作 Q。code
queue<int> Q;
能够看出,声明队列的方法是于上面相同的。
但这里须要注意的是数据结构的声明:声明的数据结构必须能使用 " < " 进行比较,因此这里须要重载运算符
(重载至关于能够本身定义"<"运算符对你声明的class的意义)
例:构建一个本身的数据结构 "node",并声明一个node的优先队列。这样的队列每次出队的是最小值。若想出队最大元素,将 return F > a.F 改为 return F < a.F 便可。
class node { public: //这里能够声明本身的数据 int F; // 这里重载小于符号,返回的值则是 < 符号的运算值 bool operator < (const node & a) const { return F > a.F; } }; priority_queue<node> Q;
(粉红色的函数为经常使用函数!大部分状况下这些函数就够用了)
无参函数:
empty():若是queue为空,返回True, 反之则返回 False。
top():返回队列顶端元素(最大的或最小的那个元素)
pop():删除队列第一个元素,并不返回元素(通常与front()配合使用:先返front(),再pop(),至关于出队列操做)。
size():返回queue内数据的个数(至关于数组长度)。
#通常用法:(假如是一个int类型的队列) while(!Q.empty()) {//当队列不为空 int I = Q.top(); Q.pop();//元素出队列 ...//对I的某些操做
有参函数:
push(type):把一个数据(type)压入栈顶(至关于入栈)。
swap(Q1):交换Q 和 Q1 中的内容(Q1是另外一个swap对象)。
//假设队列内的数据类型是data class data { int a; int b; public: data(int x, int y):a(x), b(y) {} bool operator < (const node & a) const { return a + b > a.a + a.b; } }; priority_queue<node> Q; //push: data d(1,2); Q.push(d); //或者 Q.push(data(1,2));
push的优化:emplace函数(点击蓝色字体>emplace<)