詳解C++模擬實現priority_queue(仿函數)
優(yōu)先級隊列
優(yōu)先隊列是一種容器適配器,根據嚴格的弱排序標準,它的第一個元素總是它所包含的元素中最大的。類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先隊列中位于頂部的元素)
學習優(yōu)先級隊列時最主要的是仿函數的使用,如下less和greater
#include <vector>
namespace QBL
{
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;
}
};
//仿函數默認傳小于,則是大堆
//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;
};
}仿函數
仿函數本質就是一個類,其中重載了operator(),我們可以根據我們的需要改變比較邏輯。
關于仿函數的使用,不僅僅局限于上面代碼的比較,還可以進行類的比較,不如日期類或者日期類的指針。如果比較日期類的指針就如下:
class ComparePDate
{
public:
bool operator()(const Date* x, const Date* y)
{
return *x < *y;
}
};通過上述代碼,即使優(yōu)先級隊列插入的是日期類的指針,同樣可以按照我們需要的大小輸出。
不僅僅是日期類,還有庫中的sort函數,傳參也可以傳仿函數類型

看手冊的描述可以發(fā)現,我們需要傳我們需要的比較邏輯,sort會根據bool類型的返回確定仿函數的兩個參數哪一個排在前面。
用法如下:
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());//將仿函數的匿名對象做參數傳入,就是我們的比較方式
sort(gs.begin(), gs.end(), ComparePriceGreater());
sort(gs.begin(), gs.end(), CompareEvaluateLess());
sort(gs.begin(), gs.end(), CompareEvaluateGreater());
return 0;
}到此這篇關于C++模擬實現priority_queue(仿函數)的文章就介紹到這了,更多相關C++ priority_queue內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

