C++--priority_queue的模拟实现
一,引言
优先级队列是队列的一种特殊形式,使得队列按照大小顺序以此出队列。实现优先级队列的模拟实现需要用到两个知识点1,队列数据的调整算法,以及仿函数。
二,调整算法
优先级队列的调整算法底层就是堆的调整算法。有向下调整和向上调整两种。具体在往期的文章中有具体的讲解:
https://blog.csdn.net/2301_81893652/article/details/146443802?spm=1001.2014.3001.5501
三,仿函数
仿函数不是函数,是一个类。类内部实现()的运算符重载,返回bool类型。具体实现如下:
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;}
};
四,priority_queue的具体实现
在队queue的基础上,通过仿函数控制升序还是降序,每次进行push操作时都在之后加上调整算法。在pop操作时也都加上调整算法。其他的接口和queue保持一致。具体实现如下:
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;}
};namespace Cao
{// 默认是大堆template<class T, class Container = vector<T>, class Compare = Less<T>>class priority_queue{public:void AdjustUp(int child){Compare com;int parent = (child - 1) / 2;while (child > 0){//if (_con[parent] < _con[child])if(com(_con[parent], _con[child])){swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void AdjustDown(int parent){// 先假设左孩子小size_t child = parent * 2 + 1;Compare com;while (child < _con.size()) // child >= n说明孩子不存在,调整到叶子了{// 找出小的那个孩子//if (child + 1 < _con.size() && _con[child] < _con[child + 1])if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){++child;}//if (_con[parent] < _con[child])if (com(_con[parent],_con[child])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top(){return _con[0];}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}