国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

優(yōu)先級隊列【C++】

這篇具有很好參考價值的文章主要介紹了優(yōu)先級隊列【C++】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

priority_queue

優(yōu)先隊列(priority_queue)也是隊列的一種,priority_queue的接口是和queue的接口是相同的。所以兩者的使用語法也是相同的。我們直接看優(yōu)先隊列(priority——queue)的底層實現(xiàn)原理。

默認(rèn)情況下priority_queue是大堆。

priority_queue 使用

//用vector作為底層容器,內(nèi)部構(gòu)造大堆結(jié)構(gòu)。
priority_queue<int, vector<int>, less<int>> q1;
//用vector作為底層容器,內(nèi)部構(gòu)造小堆結(jié)構(gòu)。
priority_queue<int, vector<int>, greater<int>> q2;
//不指定底層容器和內(nèi)部需要構(gòu)造的堆結(jié)構(gòu)。
priority_queue<int> q3;
#include <iostream>
#include <functional>
#include <queue>
using namespace std;
int main()
{
	priority_queue<int> q;
	q.push(3);
	q.push(6);
	q.push(0);
	q.push(2);
	q.push(9);
	q.push(8);
	q.push(1);
	while (!q.empty())
	{
		cout << q.top() << " ";
		q.pop();
	}
	cout << endl; //9 8 6 3 2 1 0
	return 0;
}

priority_queue的模擬實現(xiàn)

priority_queue的底層實際上就是堆,模擬實現(xiàn)priority_queue之前,需要知道向下調(diào)整和向上調(diào)整算法。(下面這兩種算法我們均以大堆為例)

向上調(diào)整算法

向上調(diào)整算法的前提:
若想將其調(diào)整為小堆,那么根結(jié)點的左右子樹必須都為小堆。
?若想將其調(diào)整為大堆,那么根結(jié)點的左右子樹必須都為大堆

向堆中插入數(shù)據(jù)需要使用到向上調(diào)整算法
先將元素插入到堆的末尾,即最后一個孩子之后,從插入節(jié)點位置開始和父節(jié)點比較,(我們以大堆為例),如果目標(biāo)結(jié)點的值比父結(jié)點的值大,則交換目標(biāo)結(jié)點與其父結(jié)點的位置,并將原目標(biāo)節(jié)點的父節(jié)點當(dāng)作新的目標(biāo)節(jié)點,繼續(xù)向上調(diào)整,調(diào)整到根節(jié)點結(jié)束,此時該樹已經(jīng)是大堆了

圖中是以小堆為例:
優(yōu)先級隊列【C++】,c++,開發(fā)語言

向下調(diào)整算法

向下調(diào)整算法的前提:
若想將其調(diào)整為小堆,那么根結(jié)點的左右子樹必須都為小堆。
?若想將其調(diào)整為大堆,那么根結(jié)點的左右子樹必須都為大堆
?
從根節(jié)點開始,選出左右孩子值較大的節(jié)點,讓值較大的節(jié)點與父節(jié)點的值進行比較,如果值較大的節(jié)點比父節(jié)點的值小,交換兩者位置,將原來值較大的孩子節(jié)點作為父節(jié)點,繼續(xù)向下調(diào)整,調(diào)整到葉子節(jié)點結(jié)束

圖中是以小堆為例:
優(yōu)先級隊列【C++】,c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-689893.html

push

	void push(const T & x)
		{
			_con.push_back(x);
			AdjustUp(_con.size() - 1);
		}

pop

	void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			AdjustDown(0);
		}

top

const T& top()
		{
			return _con[0];
		}

size

bool size()
		{
			return _con.size();
		}	

empty

bool empty()
		{
			return _con.empty();
		}

仿函數(shù)

using namespace std;
//仿函數(shù) /函數(shù)對象
template <class T>
class Less
{
public:
	bool operator() (const T& x, const T& y)
	{
		return x < y;
	}
};

int main()
{
	Less<int>  lessfunc;
	bool result = lessfunc(6, 2);//仿函數(shù)
	//bool result = lessfunc.operator()(6, 2);
	cout <<boolalpha <<result << endl;
	return 0;
}

完整代碼

#pragma once 
#include<vector>
#include<functional>
using namespace std;

//仿函數(shù) /函數(shù)對象
template <class T>
class Less
{
public:
	bool operator() (const T& x, const T& y)
	{
		return x < y;
	}
};
template <class T>
class Greater
{
public:
	bool operator() (const T& x, const T& y)
	{
		return x > y;
	}
};

namespace cxq
{
	template<class T, class Container = vector<T>, class Compare = Less<T> >
	class priority_queue
	{
	private:
		void AdjustDown(int parent)//從根節(jié)點開始
		{
			Compare com;//仿函數(shù)
			int child = parent * 2 + 1;
			while (child < _con.size())
			{
				//假設(shè)默認(rèn)左孩子大于右孩子
			   // if (child + 1 < _con.size() && _con[child + 1] > _con[child])//右孩子要存在,防止越界
				if (child + 1 < _con.size() && com(_con[child + 1], _con[child]))
				{
					child++;
				}
				//if (_con[child] > _con[parent])
				if (com(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					int  parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}

		}
		void AdjustUp(int child)
		{
			Compare com;//仿函數(shù)
			int parent = (child - 1) / 2;
			//大堆

			while (child > 0)
			{
				//if (_con[child] > _con[parent])
				if (com(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					int child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
	public:
		//默認(rèn)構(gòu)造
		priority_queue()
		{}
		template<class InputIterator>
		//構(gòu)造函數(shù)
		priority_queue(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				_con.push_back(*first);
				first++;
			}
			//建堆
			//最后一個非葉子節(jié)點
			for (size_t i = (_con.size() - 1 - 1) / 2; i >= 0; i++)
			{
				AdjustDown(i);
			}
		}
		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			AdjustDown(0);
		}
		void push(const T& x)
		{
			_con.push_back(x);
			AdjustUp(_con.size() - 1);
		}
		const T& top()
		{
			return _con[0];
		}
		bool empty()
		{
			return _con.empty();
		}
		bool size()
		{
			return _con.size();
		}
	private:
		Container _con;

	};
	void test_priority_queue1()
	{
		//默認(rèn)是大堆--less
		//priority_queue<int> pq;
		priority_queue<int, vector<int>, Greater<int> > pq;//小堆
		pq.push(3);
		pq.push(5);
		pq.push(1);
		pq.push(4);
		while (!pq.empty())
		{
			cout << pq.top() << " ";
			pq.pop();
		}
		cout << endl;
	}
	class Date
	{
	public:
		Date(int year = 1900, int month = 1, int day = 1)
			: _year(year)
			, _month(month)
			, _day(day)
		{}

		bool operator<(const Date& d)const
		{
			return (_year < d._year) ||
				(_year == d._year && _month < d._month) ||
				(_year == d._year && _month == d._month && _day < d._day);
		}

		bool operator>(const Date& d)const
		{
			return (_year > d._year) ||
				(_year == d._year && _month > d._month) ||
				(_year == d._year && _month == d._month && _day > d._day);
		}

		friend ostream& operator<<(ostream& _cout, const Date& d);//聲明
	private:
		int _year;
		int _month;
		int _day;
	};
	
	ostream& operator<<(ostream& _cout, const Date& d)
	{
		_cout << d._year << "-" << d._month << "-" << d._day;
		return _cout;
	}
	struct  LessPDate
	{
		//仿函數(shù)
		bool operator() ( const Date * p1 , const Date* p2)
		{
			return *p1 < *p2;
		}
	};
	void test_priority_queue2()
	{
		//priority_queue<Date> pq;
		//pq.push(Date(2023, 7, 20));
		//pq.push(Date(2023, 6, 20));
		//pq.push(Date(2023, 8, 20));
		//while (!pq.empty())
		//{
		//	cout << pq.top() << " ";
		//	pq.pop();
		//}
		//cout << endl;
		priority_queue<Date*, vector<Date*>, LessPDate> pq;
		pq.push(new Date(2023, 7, 20));
		pq.push(new Date(2023, 6, 20));
		pq.push(new Date(2023, 8, 20));
		while (!pq.empty())
		{
			cout << *pq.top() << " ";
			pq.pop();
		}
		cout << endl;
	}
	
}

到了這里,關(guān)于優(yōu)先級隊列【C++】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 『C++ - STL』之優(yōu)先級隊列( priority_queue )

    『C++ - STL』之優(yōu)先級隊列( priority_queue )

    什么是優(yōu)先級隊列,從該名中可以知道他一定有隊列的一定屬性,即先入先出(LILO),而這里的優(yōu)先級則可以判斷出它的另一個特點就是可以按照一定的條件將符合該條件的先進行出隊,這就是優(yōu)先級隊列; 而在數(shù)據(jù)結(jié)構(gòu)中有一個支持該操作的結(jié)構(gòu) - 堆( heap ); 而在STL中,這個

    2024年02月07日
    瀏覽(22)
  • 【C++初階】模擬實現(xiàn)優(yōu)先級隊列priority_queue

    【C++初階】模擬實現(xiàn)優(yōu)先級隊列priority_queue

    ??個人主頁:@Weraphael ???作者簡介:目前學(xué)習(xí)C++和算法 ??專欄:C++航路 ?? 希望大家多多支持,咱一起進步!?? 如果文章對你有幫助的話 歡迎 評論?? 點贊???? 收藏 ?? 加關(guān)注? 優(yōu)先級隊列顧名思義就是 按優(yōu)先級出隊列 priority_queue 是一個容器適配器,默認(rèn)使用

    2024年02月10日
    瀏覽(21)
  • 【C++雜貨鋪】優(yōu)先級隊列的使用指南與模擬實現(xiàn)

    【C++雜貨鋪】優(yōu)先級隊列的使用指南與模擬實現(xiàn)

    優(yōu)先級隊列是一種容器適配器,根據(jù)嚴(yán)格的弱排序標(biāo)準(zhǔn),它的第一個元素總是它所包含的元素中最大的。 此上下文類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先級隊列中位于頂部的元素)。 優(yōu)先級隊列被實現(xiàn)為容器適配器,容器適配器即將特定容器

    2024年02月09日
    瀏覽(19)
  • 【C++】詳解priority_queue(優(yōu)先級隊列)與函數(shù)對象

    【C++】詳解priority_queue(優(yōu)先級隊列)與函數(shù)對象

    目錄 一、priority_queue 的介紹和使用 1.1priority_queue 的介紹 2.2priority_queue 的使用 二、仿函數(shù) 2.1什么是仿函數(shù) 2.2仿函數(shù)的作用 三、函數(shù)對象的特點(知識點多) 3.1分析特點5(比較普通函數(shù)與函數(shù)對象) 3.1.1利用普通函數(shù)傳遞參數(shù) 拓展之:深度剖析函數(shù)利用模板的本質(zhì) 3.1.2利用

    2024年02月08日
    瀏覽(21)
  • C++——優(yōu)先級隊列(priority_queue)的使用及實現(xiàn)

    C++——優(yōu)先級隊列(priority_queue)的使用及實現(xiàn)

    目錄 一.priority_queue的使用 1.1、基本介紹 1.2、優(yōu)先級隊列的定義 1.3、基本操作(常見接口的使用) 1.4、重寫仿函數(shù)支持自定義數(shù)據(jù)類型 二.priority_queue的模擬實現(xiàn) 2.1、構(gòu)造重要的調(diào)整算法 2.2、常見接口的實現(xiàn) push() pop() top() empty()、size() ?三.利用仿函數(shù)改進調(diào)整算法 我們之前

    2024年02月02日
    瀏覽(18)
  • 【C++初階10-stack&queue】STL中的棧和隊列(附優(yōu)先級隊列

    本期分享:STL中的棧和隊列。 在數(shù)據(jù)結(jié)構(gòu)初階時,我們已經(jīng)學(xué)習(xí)這來那個兩種數(shù)據(jù)結(jié)構(gòu),如今來看STL中的,不過是更加標(biāo)準(zhǔn)化。而實現(xiàn)起來,會簡單得超乎你想象! 文中不足錯漏之處望請斧正! STL中的棧和隊列是容器適配器。容器適配器是對某種已有容器的再次封裝。 比如

    2024年02月06日
    瀏覽(19)
  • 【C++進階(六)】STL大法--棧和隊列深度剖析&優(yōu)先級隊列&適配器原理

    【C++進階(六)】STL大法--棧和隊列深度剖析&優(yōu)先級隊列&適配器原理

    ??博主CSDN主頁:杭電碼農(nóng)-NEO?? ? ?專欄分類:C++從入門到精通? ? ??代碼倉庫:NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 和C語言學(xué)習(xí)期間的學(xué)習(xí)順序一樣 順序表,鏈表過了就是棧和隊列 但是棧和隊列非常特殊,它的內(nèi)部結(jié)構(gòu) 并不是靠自己實現(xiàn)的,而是一種 適配

    2024年02月08日
    瀏覽(28)
  • 【c++】:“無敵的適配器來咯“棧和隊列模擬實現(xiàn)以及優(yōu)先級隊列的模擬實現(xiàn)。

    【c++】:“無敵的適配器來咯“棧和隊列模擬實現(xiàn)以及優(yōu)先級隊列的模擬實現(xiàn)。

    ? ? 文章目錄 前言 一.棧和隊列的模擬實現(xiàn) 二.優(yōu)先級隊列 總結(jié) ? 棧的介紹和使用: 1. stack是一種容器適配器,專門用在具有后進先出操作的上下文環(huán)境中,其刪除只能從容器的一端進行元素的插入與提取操作。 2. stack是作為容器適配器被實現(xiàn)的,容器適配器即是對特定類封

    2024年02月01日
    瀏覽(21)
  • 【C++】STL使用仿函數(shù)控制優(yōu)先級隊列priority_queue

    【C++】STL使用仿函數(shù)控制優(yōu)先級隊列priority_queue

    本文章講解C++STL的容器適配器:priority_queue的實現(xiàn),并實現(xiàn)仿函數(shù)控制priority_queue底層。 priority_queue叫做優(yōu)先級隊列,它的底層結(jié)構(gòu)是堆,在庫中,默認(rèn)生成的是大堆 在庫的實現(xiàn)中,使用vector作為該優(yōu)先級隊列的適配容器。 由于priority_queue也是一個適配器,所以它的接口函數(shù)

    2024年02月16日
    瀏覽(30)
  • 【C++】STL優(yōu)先級隊列(priority_queue)功能介紹以及模擬實現(xiàn)

    【C++】STL優(yōu)先級隊列(priority_queue)功能介紹以及模擬實現(xiàn)

    點進來的小伙伴不知道學(xué)過數(shù)據(jù)結(jié)構(gòu)里的堆沒有,如果學(xué)過的話,那就好說了,優(yōu)先級隊列就是堆,如果沒學(xué)過,沒關(guān)系,可以參考一下我之前寫的一篇關(guān)于堆的博客,可以點進去看看:【數(shù)據(jù)結(jié)構(gòu)】堆(包含堆排序和TOPK問題) 那么了解過堆了的話,我就不講那么細(xì)致了,

    2024年02月16日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包