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

【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼)

這篇具有很好參考價(jià)值的文章主要介紹了【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. priority_queue介紹和使用

1.1 priority_queue介紹

優(yōu)先級(jí)隊(duì)列也是在<queue>里:
【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼),STL標(biāo)準(zhǔn)模版庫(kù),c++,rpc,開發(fā)語言,算法,stl

因此和queue一樣,priority_queue也是一個(gè)容器適配器。priority_queue官方文檔

  1. 優(yōu)先隊(duì)列是一種容器適配器,根據(jù)嚴(yán)格的弱排序標(biāo)準(zhǔn),它的第一個(gè)元素總是它所包含的元素中最大的。
  2. 類似于堆,在堆中可以隨時(shí)插入元素,并且只能檢索最大堆元素(優(yōu)先隊(duì)列中位于頂部的元素)。
  3. 優(yōu)先隊(duì)列被實(shí)現(xiàn)為容器適配器,容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數(shù)來訪問其元素。元素從特定容器的“尾部”彈出,其稱為優(yōu)先隊(duì)列的頂部。
  4. 底層容器可以是任何標(biāo)準(zhǔn)容器類模板,也可以是其他特定設(shè)計(jì)的容器類。容器應(yīng)該可以通過隨機(jī)訪問迭代器訪問,并支持以下操作:
    empty():檢測(cè)容器是否為空
    size():返回容器中有效元素個(gè)數(shù)
    front():返回容器中第一個(gè)元素的引用
    push_back():在容器尾部插入元素
  5. 標(biāo)準(zhǔn)容器類vector和deque滿足這些需求。默認(rèn)情況下,如果沒有為特定的priority_queue類實(shí)例化指定容器類,則使用vector。
  6. 需要支持隨機(jī)訪問迭代器,以便始終在內(nèi)部保持堆結(jié)構(gòu)。容器適配器通過在需要時(shí)自動(dòng)調(diào)用算法函數(shù)make_heap、push_heap和pop_heap來自動(dòng)完成此操作。
1.2 priority_queue使用

優(yōu)先級(jí)隊(duì)列默認(rèn)使用vector作為其底層存儲(chǔ)數(shù)據(jù)的容器,在vector上又使用了堆算法將vector中元素構(gòu)造成堆的結(jié)構(gòu),因此priority_queue就是堆,所有需要用到堆的位置,都可以考慮使用priority_queue。注意:默認(rèn)情況下priority_queue是大堆。
【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼),STL標(biāo)準(zhǔn)模版庫(kù),c++,rpc,開發(fā)語言,算法,stl

下面我們來簡(jiǎn)單驗(yàn)證一下:
【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼),STL標(biāo)準(zhǔn)模版庫(kù),c++,rpc,開發(fā)語言,算法,stl

那如果我們想實(shí)現(xiàn)小堆呢,這里就要用到仿函數(shù):
【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼),STL標(biāo)準(zhǔn)模版庫(kù),c++,rpc,開發(fā)語言,算法,stl
【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼),STL標(biāo)準(zhǔn)模版庫(kù),c++,rpc,開發(fā)語言,算法,stl

2. 仿函數(shù)介紹

【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼),STL標(biāo)準(zhǔn)模版庫(kù),c++,rpc,開發(fā)語言,算法,stl
仿函數(shù)是STL六大組件之一,仿函數(shù)(又稱函數(shù)對(duì)象)其實(shí)就是一個(gè)類重載了(),使得這個(gè)類的使用看上去像一個(gè)函數(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;
    }
};

這就是一個(gè)函數(shù)調(diào)用。當(dāng)然本質(zhì)是調(diào)用了類里面的operator()。文章來源地址http://www.zghlxwxcb.cn/news/detail-715682.html

3. priority_queue模擬實(shí)現(xiàn)

#include<vector>
#include<iostream>
using namespace std;
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 w
{


	template<class T, class Container = vector<T>, class Comapre = less<T>>
	class priority_queue
	{
	private:
		void AdjustDown(int parent)
		{
			Comapre com;

			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && com(_con[child],_con[child + 1]))
				{
					++child;
				}

				if (com(_con[parent],_con[child]))
				{
					swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}	
		}

		void AdjustUp(int child)
		{
			Comapre com;

			int parent = (child - 1) / 2;
			while (child > 0)
			{
				if (com(_con[parent],_con[child]))
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}


	public:
		priority_queue()
		{}

		template<class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				_con.push_back(*first);
				++first;
			}

			// 建堆
			for (int 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();
		}

		size_t size()
		{
			return _con.size();
		}
	private:
		Container _con;
	};

	void test_priority_queue1()
	{
		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
	{
		bool operator()(const Date* p1, const Date* p2)
		{
			return *p1 < *p2;
		}
	};


	void test_priority_queue2()
	{
		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)于【STL】priority_queue(優(yōu)先級(jí)隊(duì)列)詳解及仿函數(shù)使用(附完整源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 優(yōu)先級(jí)隊(duì)列priority_queue

    優(yōu)先級(jí)隊(duì)列priority_queue

    關(guān)于less建大根堆,輸出降序序列,greater建小根堆,輸出升序序列,這點(diǎn)和sort()函數(shù)相反,參考我的這篇博客 底層原理 priority_queue底層維護(hù)著一個(gè)對(duì)應(yīng)類型的,vector物理結(jié)構(gòu),但相當(dāng)于堆排序的結(jié)構(gòu),這個(gè)vector邏輯結(jié)構(gòu)是一個(gè)二叉堆; 每次 插入數(shù)據(jù) ,我們插在堆尾(vector尾),

    2024年02月16日
    瀏覽(17)
  • 優(yōu)先級(jí)隊(duì)列priority_queue模擬實(shí)現(xiàn)

    ????hello,各位讀者大大們你們好呀???? ????系列專欄:【C++的學(xué)習(xí)】 ????本篇內(nèi)容:C++容器優(yōu)先級(jí)隊(duì)列priority_queue模擬實(shí)現(xiàn) ????上一篇:string模擬實(shí)現(xiàn) ????作者簡(jiǎn)介:軒情吖,請(qǐng)多多指教( ????? ) ??- ①優(yōu)先級(jí)隊(duì)列是一種容器適配器,它的第一個(gè)元素總是

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

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

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

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

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

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

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

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

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

    2024年02月02日
    瀏覽(18)
  • 從C語言到C++_20(仿函數(shù)+優(yōu)先級(jí)隊(duì)列priority_queue的模擬實(shí)現(xiàn)+反向迭代器)

    從C語言到C++_20(仿函數(shù)+優(yōu)先級(jí)隊(duì)列priority_queue的模擬實(shí)現(xiàn)+反向迭代器)

    目錄 1.?priority_queue的模擬實(shí)現(xiàn) 1.1 未完全的priority_queue 1.2 迭代器區(qū)間構(gòu)造和無參構(gòu)造 1.3?仿函數(shù)的介紹和使用 1.4 完整priority_queue代碼: 1.5 相關(guān)筆試選擇題 答案: 2.?反向迭代器 2.1 反向迭代器的普通實(shí)現(xiàn) reverse_iterator.h(不對(duì)稱版) 2.2 反向迭代器的對(duì)稱實(shí)現(xiàn) reverse_iterator.

    2024年02月10日
    瀏覽(23)
  • [C++] STL_priority_queue(優(yōu)先級(jí)隊(duì)列) 的使用及底層的模擬實(shí)現(xiàn),容器適配器,deque的原理介紹

    [C++] STL_priority_queue(優(yōu)先級(jí)隊(duì)列) 的使用及底層的模擬實(shí)現(xiàn),容器適配器,deque的原理介紹

    priority_queue文檔介紹 翻譯: 1. 優(yōu)先隊(duì)列是一種 容器適配器 ,根據(jù)嚴(yán)格的弱排序標(biāo)準(zhǔn), 它的第一個(gè)元素總是它所包含的元素中最大的。 2. 此上下文類似于 堆 , 在堆中可以隨時(shí)插入元素,并且只能檢索最大堆元素(優(yōu)先隊(duì)列中位于頂部的元素)。 3. 優(yōu)先隊(duì)列被實(shí)現(xiàn)為容器適配

    2024年02月04日
    瀏覽(19)
  • 【C++入門到精通】C++入門 —— priority_queue(STL)優(yōu)先隊(duì)列

    【C++入門到精通】C++入門 —— priority_queue(STL)優(yōu)先隊(duì)列

    ?文章綁定了VS平臺(tái)下std::priority_queue的源碼,大家可以下載了解一下?? 前面我們講了C語言的基礎(chǔ)知識(shí),也了解了一些數(shù)據(jù)結(jié)構(gòu),并且講了有關(guān)C++的命名空間的一些知識(shí)點(diǎn)以及關(guān)于C++的缺省參數(shù)、函數(shù)重載,引用 和 內(nèi)聯(lián)函數(shù)也認(rèn)識(shí)了什么是類和對(duì)象以及怎么去new一個(gè) ‘對(duì)象

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

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

    2024年02月06日
    瀏覽(19)
  • C++優(yōu)先隊(duì)列(priority_queue)詳解

    C++優(yōu)先隊(duì)列(priority_queue)詳解

    目錄 一、 定義 二、優(yōu)先隊(duì)列內(nèi)元素訪問 三、優(yōu)先隊(duì)列常用函數(shù) 四、優(yōu)先隊(duì)列內(nèi)元素的優(yōu)先級(jí) ?????????優(yōu)先隊(duì)列(priority_queue),底層的數(shù)據(jù)結(jié)構(gòu)為 堆(heap) ,以此 保證隊(duì)首元素一定是當(dāng)前隊(duì)列所有元素中優(yōu)先級(jí)最高的。 我們也可以隨時(shí)往優(yōu)先隊(duì)里面加入(push)元素,其隊(duì)

    2024年02月16日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包