1. 程式人生 > >STL - priority_queue(優先隊列)

STL - priority_queue(優先隊列)

printf 要求 重載 less 插入 使用 contain 最小值 ESS

參考:http://www.cnblogs.com/xzxl/p/7266404.html

一、基本定義:

優先隊列容器與隊列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有一個特性,就是隊列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前隊列中最大的元素出隊。這點類似於給隊列裏的元素進行了由大到小的順序排序。元素的比較規則默認按元素值由大到小排序,可以重載“<”操作符來重新定義比較規則。

優先級隊列可以用向量(vector)或雙向隊列(deque)來實現(註意list container不能用來實現queue,因為list的叠代器不是任意存取iterator,而pop中用到堆排序時是要求randomaccess iterator 的!):
priority_queue<vector<int>, less<int> > pq1;     // 使用遞增less<int>函數對象排序
priority_queue<deque<int>, greater<int> > pq2;   // 使用遞減greater<int>函數對象排序
其成員函數有“判空(empty)” 、“尺寸(Size)” 、“棧頂元素(top)” 、“壓棧(push)” 、“彈棧(pop)”等。

二、用途
最短路算法優化, 斜率DP優化等

三、代碼實現&基本操作

///優先隊列的基本使用
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

///自定義優先級方法1,定義結構,使用運算符重載

struct cmp1
{
    bool operator ()(int &a, int &b)
    {
        
return a > b; //最小值優先(是“>" 註意別與排序搞混) } }; struct cmp2 { bool operator ()(int &a, int &b) { return a < b; //最大值優先 } }; ///自定義優先級方法2,定義結構,使用運算符重載 struct numb_1 { int x; bool operator < (const numb_1 &a) const { return x > a.x; //最小值優先(與前面的聯系記憶)
} }; struct numb_2 { int x; bool operator < (const numb_2 &a) const { return x < a.x; //最大值優先 } }; ///測試用數據 int a[] = {2, 520, 30, 18, 4, 1314, 98, 0}; numb_1 num1[] = {2, 520, 30, 18, 4, 1314, 98, 0}; //用於自定義方法2 numb_2 num2[] = {2, 520, 30, 18, 4, 1314, 98, 0}; //用於自定義方法2 int main() { ///采用默認優先級 priority_queue<int> que; //(由大到小)構造隊列(最單純的優先隊列) ///自定義優先級方法1 priority_queue<int, vector<int>,cmp1> que1; //最小值優先 priority_queue<int, vector<int>,cmp2> que2; //最大值優先 ///使用系統的函數 //(註意最後的括號,不是“<<”, 因為”<<“是右移運算符 priority_queue<int, vector<int>, greater<int> > que3; //最小值優先 priority_queue<int, vector<int>, less<int> > que4; //最大值優先 ///自定義優先級方法2 priority_queue<numb_1> que5; //最小值優先 priority_queue<numb_2> que6; //最大值優先 ///Let‘s begin ///入隊操作 for(int i = 0; a[i]; i++) { que.push(a[i]); que1.push(a[i]); que2.push(a[i]); que3.push(a[i]); que4.push(a[i]); } for(int i = 0; num1[i].x; i++) que5.push(num1[i]); for(int i = 0; num2[i].x; i++) que6.push(num2[i]); ///輸出結果 printf("采用默認優先級:\n"); printf("(priority_queue<int>que;)\n"); printf("Que 0:\n"); while(!que.empty()) //判斷是否為空 { printf("%d ", que.top()); //隊首元素 que.pop(); //出隊 } puts(""); puts(""); printf("采用結構體自定義優先級方式一:\n"); printf("(priority_queue<int,vector<int>,cmp>que;)\n"); printf("Que 1:\n"); while(!que1.empty()){ printf("%d ",que1.top()); que1.pop(); } puts(""); printf("Que 2:\n"); while(!que2.empty()){ printf("%d ",que2.top()); que2.pop(); } puts(""); puts(""); printf("采用頭文件\"functional\"內定義優先級:\n"); printf("(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n"); printf("Que 3:\n"); while(!que3.empty()){ printf("%d ",que3.top()); que3.pop(); } puts(""); printf("Que 4:\n"); while(!que4.empty()){ printf("%d ",que4.top()); que4.pop(); } puts(""); puts(""); printf("采用結構體自定義優先級方式二:\n"); printf("(priority_queue<number>que)\n"); printf("Que 5:\n"); while(!que5.empty()){ printf("%d ",que5.top()); que5.pop(); } puts(""); printf("Que 6:\n"); while(!que6.empty()){ printf("%d ",que6.top()); que6.pop(); } puts(""); return 0; }

STL - priority_queue(優先隊列)