亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解C++模擬實現(xiàn)priority_queue(仿函數(shù))

 更新時間:2024年10月26日 14:30:45   作者:Hungry_11  
本文主要介紹了關于C++中優(yōu)先級隊列的模擬實現(xiàn),以及仿函數(shù)的使用,優(yōu)先級隊列是一種容器適配器,其第一個元素總是最大的,仿函數(shù)本質是一個類,重載了operator(),可改變比較邏輯,同時,文中還介紹了如何進行類的比較,如日期類或其指針的比較,以及庫中sort函數(shù)的使用方法

優(yōu)先級隊列

優(yōu)先隊列是一種容器適配器,根據(jù)嚴格的弱排序標準,它的第一個元素總是它所包含的元素中最大的。類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先隊列中位于頂部的元素)
學習優(yōu)先級隊列時最主要的是仿函數(shù)的使用,如下less和greater

#include <vector>
namespace QBL
{
	template<class T>//仿函數(shù),本質就是運算符重載
	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;
		}
	};
	//仿函數(shù)默認傳小于,則是大堆
	//less這點庫里面也是和人的直覺是反著的,明明是less,卻是大堆
	template<class T, class Container = vector<T>, class Compare = less<T>>
	class priority_queue
	{
	public:
		void adjust_up(size_t child)
		{
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[child] > _con[parent])
				//if (_con[parent] < _con[child])
				if(Compare()(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
		void adjust_down(size_t parent)
		{
			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && Compare()(_con[child], _con[child + 1]))
					++child;
				//if (_con[child] > _con[parent])
				if(Compare()(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}
		void push(const T& val)
		{
			_con.push_back(val);
			adjust_up(_con.size() - 1);
		}
		void pop()//刪除堆頂
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}
		const T& top()
		{
			return _con[0];
		}
		bool empty()
		{
			return _con.empty();
		}
		size_t size()
		{
			return _con.size();
		}
	private:
		Container _con;
	};
}

仿函數(shù)

仿函數(shù)本質就是一個類,其中重載了operator(),我們可以根據(jù)我們的需要改變比較邏輯。
關于仿函數(shù)的使用,不僅僅局限于上面代碼的比較,還可以進行類的比較,不如日期類或者日期類的指針。如果比較日期類的指針就如下:

class ComparePDate
{
public:
	bool operator()(const Date* x, const Date* y)
	{
		return *x < *y;
	}
};

通過上述代碼,即使優(yōu)先級隊列插入的是日期類的指針,同樣可以按照我們需要的大小輸出。

不僅僅是日期類,還有庫中的sort函數(shù),傳參也可以傳仿函數(shù)類型

看手冊的描述可以發(fā)現(xiàn),我們需要傳我們需要的比較邏輯,sort會根據(jù)bool類型的返回確定仿函數(shù)的兩個參數(shù)哪一個排在前面。
用法如下:

struct goods
{ 
	string _name;//名字
	double _price;//價格
	int _evaluate;//評價
	goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{}
};
struct ComparePriceLess
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._price < gr._price;
	}
};
struct ComparePriceGreater
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._price > gr._price;
	}
};
struct CompareEvaluateLess
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._evaluate < gr._evaluate;
	}
};
struct CompareEvaluateGreater
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._evaluate > gr._evaluate;
	}
};
int main()
{
	vector<goods> gs = { {"蘋果",3.1,5},{"香蕉",2.1,4} ,{"菠蘿",1.1,3} ,{"葡萄",4.1,2} };
	sort(gs.begin(), gs.end(), ComparePriceLess());//將仿函數(shù)的匿名對象做參數(shù)傳入,就是我們的比較方式
	sort(gs.begin(), gs.end(), ComparePriceGreater());
	sort(gs.begin(), gs.end(), CompareEvaluateLess());
	sort(gs.begin(), gs.end(), CompareEvaluateGreater());
	return 0;
}

到此這篇關于C++模擬實現(xiàn)priority_queue(仿函數(shù))的文章就介紹到這了,更多相關C++ priority_queue內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 異常處理 catch(...)介紹

    C++ 異常處理 catch(...)介紹

    catch(…)能夠捕獲多種數(shù)據(jù)類型的異常對象,所以它提供給程序員一種對異常 對象更好的控制手段,使開發(fā)的軟件系統(tǒng)有很好的可靠性
    2013-09-09
  • C++?Protobuf實現(xiàn)接口參數(shù)自動校驗詳解

    C++?Protobuf實現(xiàn)接口參數(shù)自動校驗詳解

    用C++做業(yè)務發(fā)開的同學是否還在不厭其煩的編寫大量if-else模塊來做接口參數(shù)校驗呢?今天,我們就模擬Java里面通過注解實現(xiàn)參數(shù)校驗的方式來針對C++?protobuf接口實現(xiàn)一個更加方便、快捷的參數(shù)校驗自動工具,希望對大家有所幫助
    2023-04-04
  • C++list的模擬實現(xiàn)

    C++list的模擬實現(xiàn)

    list是數(shù)據(jù)結構中的鏈表,在C++的STL中,有l(wèi)ist的模板,STL中的list的結構是帶頭雙向循環(huán)鏈表,當然STL中還有一個forward_list的鏈表,這個鏈表是一個帶頭的單鏈表。為了更好的理解list,我們來對其進行模擬實現(xiàn)。,需要的朋友可以參考
    2023-04-04
  • C++ map 根據(jù)value找key的實現(xiàn)

    C++ map 根據(jù)value找key的實現(xiàn)

    今天小編就為大家分享一篇C++ map 根據(jù)value找key的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++實現(xiàn)合并兩個排序的鏈表

    C++實現(xiàn)合并兩個排序的鏈表

    這篇文章主要為大家詳細介紹了C++實現(xiàn)合并兩個排序的鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 一篇文章詳細解釋C++的友元(friend)

    一篇文章詳細解釋C++的友元(friend)

    這篇文章主要為大家詳細介紹了C++的友元(friend),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池

    項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池

    這篇文章主要介紹了項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C語言學生管理系統(tǒng)源碼分享

    C語言學生管理系統(tǒng)源碼分享

    這篇文章主要為大家分享了C語言學生管理系統(tǒng)的源碼,幫助大家學習結構體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C++多線程編程簡單實例

    C++多線程編程簡單實例

    本文給大家分享的是C++多線程編程簡單實例,由于C++本身沒有多線程機制,在windows下我們使用調用SDK win32 api來實現(xiàn),示例都很簡單,講解的也很詳細,推薦給大家。
    2015-03-03
  • C++實現(xiàn)LeetCode(37.求解數(shù)獨)

    C++實現(xiàn)LeetCode(37.求解數(shù)獨)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(37.求解數(shù)獨),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07

最新評論