STL优先队列实现

逻辑

我们知道普通队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级的,我
们需要在这些计算机的任务中找出优先级最高的任务先执行,执行完毕后就需要把这个任务从队列中移除。
普通的队列要完成这样的功能,需要每次遍历队列中的所有元素,比较并找出最大值,效率不是很高,这个时候,我们就可以使用一种特殊的队列来完成这种需求,优先队列。

实现

优先队列的底层是用堆实现的,因为堆顶就是最大元素。
在优先队列中默认存放数据的容器是vector,在声明时也可以用deque(双向队列)

代码

#ifndef priority_queue
#define priority_queue
using namespace std;

template <class Ty, class Container = vector<Ty>, class Compare = less<typename Container::value_type> >
class priorityQueue
{
public:
    typedef Container container_type;
    typedef typename Container::value_type value_type;
    typedef typename Container::size_type size_type;
    typedef typename Container::reference reference;
    typedef typename Container::const_reference const_reference;
    //直接构造一个空的优先队列
    priorityQueue():c(), comp(){}//默认比较方法, 默认容器vector
    priorityQueue(const Compare& pred):c(), comp(pred){}//指定比较方法, 默认容器vector
    priorityQueue(const Container& Cont, const Compare comps):c(Cont), comp(comps){}////指定比较方法, 指定容器Cont
    //使用容器的迭代器来将容器中数据构造成优先队列
    template <class Iterator>
    priorityQueue(Iterator first, Iterator last):c(first, last), comp(){
        //将该容器的数据先放到默认的vector容器c中,
        //使用默认的比较方法less
        make_heap(c.begin(), c.end(), comp);
    }
    template <class Iterator>
    priorityQueue(Iterator first, Iterator last, const Compare& comps):c(first, last), comp(comps){
        //将该容器的数据先放到默认的vector容器c中,
        //使用特定的比较方法comps
        make_heap(c.begin(), c.end(), comp);
    }
    template <class Iterator>
    priorityQueue(Iterator first, Iterator last, const Compare& comps, const Container& Cont):c(Cont), comp(comps){
        //将该容器的数据先放到指定的的comps容器c中,
        //使用特定的比较方法comps
        c.insert(c.end(), first, last);
        make_heap(c.begin(), c.end(), comp);
    }
    bool isempty(){
        return c.empty();
    }
    size_type size(){
        return c.size();
    }
    reference top(){
        return c.front();
    }
    void push(value_type& value){
        c.push_back(value);
        make_heap(c.begin(), c.end(), comp);
    }
    void pop(){
        pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
    }
private:
    Container c;//容器类vector
    Compare comp;//比较方法
};
#endif // priority_queue

测试

int main()
{

    int i,number[20]={29,23,20,22,17,15,26,51,19,12,35,40};
    priorityQueue<int, deque<int>> a;
    for(i=0;i<12;i++)
        a.push(number[i]);
    for(i=0;i<12;i++)
        cout<<number[i]<<",";
    cout << endl;
    cout << a.size() <<endl;
    while(!a.isempty()){
        cout << a.top() <<",";
        a.pop();
    }
    cout << endl;
    //make_heap(&number[0], &number[12]);
    return 0;
}

©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值