lightblueme

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

C++ 优先队列

C++ 优先队列

#include <queue>

priority_queue<Type, Container, Functional>:Type为数据的类型,Container为数据存储的容器类型,Functional为比较函数

默认是vector,最大堆

下面,描述如何定制优先队列

我们在这里关注比较函数的实现,对于比较函数有两种方式,一种是定义单独的比较函数,另一种是在定义的数据类型内部定义比较策略

一、仿函数体现出比一般的函数更大的灵活性,我们使用仿函数来实现

struct cmpmin{
    bool operator ()(int& a,int &b){
        return a>b;
    }
};

struct cmpmax{
    bool operator() (int& a,int& b){
        return a<b;
    }
};

当定义大于号的时候是小数优先,当定义小于号的时候是大数优先

实际上仿函数可以看做是对小于号的重载。

二、在数据类型内部加以定义

struct minnode{
    int data;
    bool operator < (const minnode& node) const{
        return this->data>node.data;
    }
};

struct maxnode{
    int data;
    bool operator < (const maxnode& node)const{
        return this->data<node.data;
    }
};

这里实现小于号(实际上只能实现小于号,实现大于号会报错),它的意义和上面是一样的,

当定义大于号的时候是小数优先,当定义小于号的时候是大数优先。

总是外部定义和内部实现一致的时候是递增,如果不一致时递减

 

下面举个栗子

int nums[]={3,2,1,4,3,9,12,3,43,15};
minnode minnodes[]={3,2,1,4,3,9,12,3,43,15};
maxnode maxnodes[]={3,2,1,4,3,9,12,3,43,15};
int main()
{
    queue<int> q;//normal queue
    priority_queue<int,vector<int>,cmpmin> minq;//minimum queue
    priority_queue<int,vector<int>,cmpmax> maxq;//maximum queue
    priority_queue<minnode,vector<minnode> >minnodeq;
    priority_queue<maxnode,vector<maxnode> >maxnodeq;
    for(int i=0;i<10;i++){
        q.push(nums[i]);
        minq.push(nums[i]);
        maxq.push(nums[i]);
        minnodeq.push(minnodes[i]);
        maxnodeq.push(maxnodes[i]);
    }
    cout<<""<<q.front()<<" "<<q.back()<<endl;// 3 15

   cout << "top of minq " << minq.top() << endl;//1
     cout << "top of maxq " << maxq.top() << endl;//43
    cout << "top of minnodeq " << minnodeq.top().data << endl;//1
   cout << "top of maxnodeq " <<maxnodeq.top().data << endl;//43

    return 0;
}

在一些操作上,queue和priority_queue是不一样的,前者是一个线性的结构,因此可以使用队前,队尾函数,也就是front(),back(),但是优先队列的意义已经和传统的队列的意义不太一样了,实际上是一个堆,队前、队尾函数不可用,可以使用的函数是top()。两者都可以使用pop()函数来去掉队首或者堆顶的数据。

posted on 2015-06-09 17:20  lightblueme  阅读(277)  评论(0编辑  收藏  举报