最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

優(yōu)先級隊列

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

#include <vector>
namespace QBL
{
	template<class T>//仿函數(shù),本質(zhì)就是運算符重載
	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ù)默認(rèn)傳小于,則是大堆
	//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ù)本質(zhì)就是一個類,其中重載了operator(),我們可以根據(jù)我們的需要改變比較邏輯。
關(guān)于仿函數(shù)的使用,不僅僅局限于上面代碼的比較,還可以進(jìn)行類的比較,不如日期類或者日期類的指針。如果比較日期類的指針就如下:

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;
}

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

相關(guān)文章

  • C/C++ MD5算法的實現(xiàn)代碼

    C/C++ MD5算法的實現(xiàn)代碼

    下面就將網(wǎng)上有關(guān)MD5算法一些知識整理一下,方面自己查閱,需要的朋友可以參考下
    2017-07-07
  • Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序

    Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序

    這篇文章主要介紹了Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序,文中給出了實現(xiàn)的幾個關(guān)鍵代碼片段,剩下的只要套上main和線程調(diào)用的相關(guān)函數(shù)即可,非常詳細(xì),需要的朋友可以參考下
    2016-02-02
  • C++下程序運行時間的四種常用計時方法總結(jié)

    C++下程序運行時間的四種常用計時方法總結(jié)

    這篇文章主要介紹了C++下程序運行時間的四種常用計時方法,介紹了幾種常用的計時方法,包括低精度的clock()和GetTickCount(),以及高精度的gettimeofday()和QueryPerformanceCounter(),需要的朋友可以參考下
    2024-09-09
  • Qt基于QScrollArea實現(xiàn)界面嵌套移動

    Qt基于QScrollArea實現(xiàn)界面嵌套移動

    在實際的應(yīng)用場景中,經(jīng)常會出現(xiàn)軟件界面戰(zhàn)場圖大于實際窗體大小。本文將利用QScrollArea可以為widget窗體添加滾動條,實現(xiàn)界面嵌套移動,感興趣的可以了解一下
    2022-06-06
  • 純C語言實現(xiàn)五子棋

    純C語言實現(xiàn)五子棋

    本文給大家分享的是去年制作的一個純C語言實現(xiàn)的五子棋的代碼,雖然沒有帶漂亮的界面,還是推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • 劍指offer之C++語言實現(xiàn)鏈表(兩種刪除節(jié)點方式)

    劍指offer之C++語言實現(xiàn)鏈表(兩種刪除節(jié)點方式)

    今天小編就為大家分享一篇關(guān)于劍指offer之C++語言實現(xiàn)鏈表(兩種刪除節(jié)點方式),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法

    VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法

    這篇文章主要介紹了VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法,較為詳細(xì)的分析了VC使用ADO操作數(shù)據(jù)庫的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • C++運算符重載限制介紹

    C++運算符重載限制介紹

    這篇文章主要介紹了C++運算符重載限制,關(guān)于運算符的重載并不是隨心所欲的。C++給出了一些限制,從而保證了規(guī)范,以及程序運行的準(zhǔn)確性,下面來了解C++運算符重載限制的詳細(xì)內(nèi)容吧,需要的朋友也可以參考一下
    2022-01-01
  • C C++ LeetCode題解在二叉樹中增加一行示例詳解

    C C++ LeetCode題解在二叉樹中增加一行示例詳解

    這篇文章主要為大家介紹了C C++ LeetCode題解在二叉樹中增加一行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • C語言實現(xiàn)小小圣誕樹源代碼

    C語言實現(xiàn)小小圣誕樹源代碼

    圣誕節(jié)當(dāng)然要有個圣誕樹了,今天給你們用C語言編寫一個雪夜圣誕樹,這篇文章主要給大家介紹了關(guān)于C語言實現(xiàn)小小圣誕樹的相關(guān)資料,需要的朋友可以參考下
    2023-12-12

最新評論

曲麻莱县| 天峨县| 营山县| 砚山县| 响水县| 桐城市| 电白县| 浮山县| 辽宁省| 巴彦淖尔市| 锡林郭勒盟| 德兴市| 桑日县| 华容县| 元谋县| 米泉市| 嵊州市| 西乌珠穆沁旗| 类乌齐县| 东辽县| 武安市| 凤山县| 鄂托克旗| 广灵县| 汶上县| 林州市| 淮北市| 乌鲁木齐市| 利辛县| 德庆县| 齐齐哈尔市| 故城县| 团风县| 青冈县| 佳木斯市| 孟村| 循化| 金湖县| 合江县| 施秉县| 茶陵县|