1. 程式人生 > 其它 >c++優先佇列(最大堆)的基本用法以及排序用法

c++優先佇列(最大堆)的基本用法以及排序用法

技術標籤:c++佇列c++資料結構演算法

c++的queue中有一種優先佇列 他會自動按要求遞增或者遞減排序
在寫一些演算法題的時候可以起到很好的輔助作用
今天給大家簡單介紹一下這些

優先佇列

既然是佇列那麼先要包含標頭檔案#include ,
他和queue不同的就在於我們可以自定義其中資料的優先順序, 讓優先順序高的排在佇列前面,優先出隊

優先佇列也具有普通佇列的所有的特性 比如size等等 其本質是用堆實現的 所以又稱為最大(小)堆

定義

priority_queue<Type,Container,Functional>
其中:
Type是資料型別
Container是容器型別(Container必須是用陣列實現的容器,比如vector等預設為vector

Functional就是比較的方式,也是我們後邊實現排序的重要角色

當我們不宣告任何的時候,預設是大頂堆

priority_queue<int, vector<int>, greater<int>> q;//升序
	priority_queue<int, vector<int>, less<int>> q;//降序
	//greater和less是std中實現的兩個仿函式

例子

int main() {

	//auto cmp = [&](const auto& a, const auto& b) {
	//	return a.first + a.second < b.first + b.second;
//}; priority_queue<int, vector<int>, greater<int>> q1;//升序 priority_queue<int, vector<int>, less<int>> q2;//降序 //greater和less是std中實現的兩個仿函式 vector<int> nums = { 3,5,9,1,6,7,4 }; for (int i = 0; i < nums.size(); i++) { q1.push(nums[i]); q2.push(nums[i]);
} while (!q1.empty()) { cout << q1.top() << " "; q1.pop(); } cout << endl; while (!q2.empty()) { cout << q2.top() << " "; q2.pop(); } return 0; }

我們可以觀察一下執行結果
在這裡插入圖片描述
可見最大最小的排序對於字母上邊沒有給出例子 但是升序降序和數字是一樣的

對於pair的排序

auto cmp = [&](const auto& a, const auto& b) {
		return a.first  < b.first ;
		//first+second之和小的在後大的在前
	};
	vector < pair<int, int>> pairs;
	for (int i = 0; i < 5; i++) {
		pair<int, int> a;
		a.first = i + 1;
		a.second = 5 - i;
		pairs.push_back(a);
	}
	cout << "排序前:" << endl;
	for (auto pair:pairs) {
		cout << pair.first << " " << pair.second << "  |  ";
	}
	priority_queue < pair<int, int>, vector<pair<int, int>>, decltype(cmp)> PairQueue(cmp);
	//decltype是自動識別型別
	for (auto pair : pairs) {
		PairQueue.push(pair);
	}
	cout << endl;
	cout << "排序後:" << endl;
	while (!PairQueue.empty()) {
		auto pair = PairQueue.top();
		cout << pair.first << " " << pair.second << "  |  ";
		PairQueue.pop();
	}
	return 0;

在這裡插入圖片描述
我們可以通過這種方式對於pair中任何想要的想要的結果設計cmp

這就是我所介紹的全部內容 希望對大家有幫助