詳解C++模擬實(shí)現(xiàn)priority_queue(仿函數(shù))
優(yōu)先級(jí)隊(duì)列
優(yōu)先隊(duì)列是一種容器適配器,根據(jù)嚴(yán)格的弱排序標(biāo)準(zhǔn),它的第一個(gè)元素總是它所包含的元素中最大的。類似于堆,在堆中可以隨時(shí)插入元素,并且只能檢索最大堆元素(優(yōu)先隊(duì)列中位于頂部的元素)
學(xué)習(xí)優(yōu)先級(jí)隊(duì)列時(shí)最主要的是仿函數(shù)的使用,如下less和greater
#include <vector>
namespace QBL
{
template<class T>//仿函數(shù),本質(zhì)就是運(yùn)算符重載
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這點(diǎn)庫(kù)里面也是和人的直覺(jué)是反著的,明明是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ì)就是一個(gè)類,其中重載了operator(),我們可以根據(jù)我們的需要改變比較邏輯。
關(guān)于仿函數(shù)的使用,不僅僅局限于上面代碼的比較,還可以進(jìn)行類的比較,不如日期類或者日期類的指針。如果比較日期類的指針就如下:
class ComparePDate
{
public:
bool operator()(const Date* x, const Date* y)
{
return *x < *y;
}
};通過(guò)上述代碼,即使優(yōu)先級(jí)隊(duì)列插入的是日期類的指針,同樣可以按照我們需要的大小輸出。
不僅僅是日期類,還有庫(kù)中的sort函數(shù),傳參也可以傳仿函數(shù)類型

看手冊(cè)的描述可以發(fā)現(xiàn),我們需要傳我們需要的比較邏輯,sort會(huì)根據(jù)bool類型的返回確定仿函數(shù)的兩個(gè)參數(shù)哪一個(gè)排在前面。
用法如下:
struct goods
{
string _name;//名字
double _price;//價(jià)格
int _evaluate;//評(píng)價(jià)
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 = { {"蘋(píng)果",3.1,5},{"香蕉",2.1,4} ,{"菠蘿",1.1,3} ,{"葡萄",4.1,2} };
sort(gs.begin(), gs.end(), ComparePriceLess());//將仿函數(shù)的匿名對(duì)象做參數(shù)傳入,就是我們的比較方式
sort(gs.begin(), gs.end(), ComparePriceGreater());
sort(gs.begin(), gs.end(), CompareEvaluateLess());
sort(gs.begin(), gs.end(), CompareEvaluateGreater());
return 0;
}到此這篇關(guān)于C++模擬實(shí)現(xiàn)priority_queue(仿函數(shù))的文章就介紹到這了,更多相關(guān)C++ priority_queue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動(dòng)校驗(yàn)詳解
用C++做業(yè)務(wù)發(fā)開(kāi)的同學(xué)是否還在不厭其煩的編寫(xiě)大量if-else模塊來(lái)做接口參數(shù)校驗(yàn)?zāi)??今天,我們就模擬Java里面通過(guò)注解實(shí)現(xiàn)參數(shù)校驗(yàn)的方式來(lái)針對(duì)C++?protobuf接口實(shí)現(xiàn)一個(gè)更加方便、快捷的參數(shù)校驗(yàn)自動(dòng)工具,希望對(duì)大家有所幫助2023-04-04
C++ map 根據(jù)value找key的實(shí)現(xiàn)
今天小編就為大家分享一篇C++ map 根據(jù)value找key的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池
這篇文章主要介紹了項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
C++實(shí)現(xiàn)LeetCode(37.求解數(shù)獨(dú))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(37.求解數(shù)獨(dú)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

