詳解C++模擬實現(xiàn)priority_queue(仿函數(shù))
優(yōu)先級隊列
優(yōu)先隊列是一種容器適配器,根據(jù)嚴格的弱排序標準,它的第一個元素總是它所包含的元素中最大的。類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先隊列中位于頂部的元素)
學習優(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ù)默認傳小于,則是大堆
//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ù)我們的需要改變比較邏輯。
關于仿函數(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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++?Protobuf實現(xiàn)接口參數(shù)自動校驗詳解
用C++做業(yè)務發(fā)開的同學是否還在不厭其煩的編寫大量if-else模塊來做接口參數(shù)校驗呢?今天,我們就模擬Java里面通過注解實現(xiàn)參數(shù)校驗的方式來針對C++?protobuf接口實現(xiàn)一個更加方便、快捷的參數(shù)校驗自動工具,希望對大家有所幫助2023-04-04
C++ map 根據(jù)value找key的實現(xiàn)
今天小編就為大家分享一篇C++ map 根據(jù)value找key的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池
這篇文章主要介紹了項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
C++實現(xiàn)LeetCode(37.求解數(shù)獨)
這篇文章主要介紹了C++實現(xiàn)LeetCode(37.求解數(shù)獨),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

