【C++/STL】6. priority_queue優先隊列

  • 優先隊列底層是靠堆實現的,是一種特殊的隊列。
  • 優先隊列的隊首元素一定是當前隊列中優先級最高的那個,也就是說,如果把優先隊列中元素依次出隊,會得到按優先級從大到小排列的一組元素
  • 向優先隊列中插入元素時,優先隊列內部的堆結構會自動調整,保證隊首元素永遠是優先級最高的。
  • priority_queue定義於queue.h,命名空間std

一、構造函數

作用 代碼 說明
定義一個priority_queue priority_queue<typename> pq; typename可以是任意基礎數據類型或STL容器

二、訪問priority_queue內元素

  • 與queue不同,priority_queue沒有front()back()方法,只能通過top()方法訪問隊元素
#include <iostream>
#include <queue>
using namespace std;
 
int main()
{
	priority_queue<int> pq;	//默認大數優先級高
	
	pq.push(1);
	pq.push(2);
	pq.push(3);
	pq.push(4);

	cout<<pq.top()<<endl;	//打印4 
	pq.pop();
	cout<<pq.top()<<endl;	//打印3 
	
	return 0;	
} 

三、常用操作

(1)基本操作

  • 設有priority_queue容器pq
操作 代碼 時間複雜度 說明
元素x入隊 pq.push(x) O(logN),N爲當前優先隊列中元素個數 -
隊首出隊 pq.pop() O(logN),N爲當前優先隊列中元素個數 出隊的是優先級最高的元素
隊列判空 pq.empty() O(1) 返回一個bool類型
訪問隊首元素(不影響隊列) pq.top() O(1) 如果隊列爲空,top()方法會報錯
獲得priority_queue內元素個數 pq.size() O(1) -

(2)設置優先級

1. 基本數據類型的優先級

  • 僅適用於基本數據類型
  • 對於int、double等類型,數字越大優先級越高
  • 對於char,字典序越大優先級越高
  • 對於基本數據類型,priority_queue<int> q;等價於priority_queue<int, vector<int>, less<int>> q
    • 其中第二個參數vector是用來承載底層的堆結構的,這裏出現的3個typename應該相同
    • 第三個參數less是對第一個參數的比較類,less<typename>代表數字大的優先級高;greater<typename>代表數字小的優先級高
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
 
int main()
{
	//priority_queue<int> pq;	//默認大數優先級高
	priority_queue<int,vector<int>,greater<int> > pq;	//小數優先級高 

	pq.push(1);
	pq.push(2);
	pq.push(3);
	pq.push(4);

	cout<<pq.top()<<endl;	//打印1
	pq.pop();
	cout<<pq.top()<<endl;	//打印2 
	
	return 0;	
} 

2. 結構體優先級設置

  • 適用於基本數據類型、結構體和STL容器
  • 下面定義一個fruit結構體,希望價格高的結構體優先級高
//方法一----------------------------------------------------
struct fruit
{
	string name;
	int price;
	
	//重載<運算符
	friend bool opreator < (fruit f1,fruit f2)
	{
		return f1.price < f2.price;	//價格高的優先級高
	}
};

priority_queue<fruit> q;	//定義fruit類型的優先隊列,內部就是價格高的fruit優先級高


//方法二----------------------------------------------------
struct fruit
{
	string name;
	int price;
};

struct cmp
{
	//重載<運算符
	bool opreator () (fruit f1,fruit f2)	//注意這裏不寫friend,小於號換括號
	{
		return f1.price < f2.price;			//價格高的優先級高
	}
};

priority_queue<fruit,vector<fruit>,cmp>	q;
  • 如果結構體內數據較大,可以在重載運算符時使用常引用來提高效率
friend bool opreator < (const fruit &f1,const fruit &f2)
{ 
	return f1.price < f2.price;	
}


bool opreator () (const fruit &f1,const fruit &f2)	
{
	return f1.price < f2.price;			
}
發佈了75 篇原創文章 · 獲贊 106 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章