priority_queue的用法

来源:互联网 发布:oecd下载数据 编辑:程序博客网 时间:2024/06/11 01:59

  优先队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列。它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序。

 priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
      priority_queue<Type, Container, Functional>     其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,默认优先队列就是大顶堆,队头元素最大。

优先队列用到的函数

                          push()将元素插入队列O(nlogn)

                          pop()删除队头

                          top()返回队头

                          empty()判断是否为空

                          size()返回队列长度

#include<iostream>#include<queue>using namespace std;int main(){    priority_queue<int>qe;   //默认最大堆    qe.push(2);    //插入元素    qe.push(6);    qe.push(1);    cout<<qe.size()<<endl;    //返回队列长度    cout<<qe.top()<<endl;     //返回队头(最大值)    qe.pop();            //删除对头    cout<<qe.top()<<endl;    cout<<qe.empty()<<endl;    //判断队列是否为空    return 0;}


STL里面定义了一个仿函数 greater<type>,对于基本类型可以用这个仿函数声明小顶堆

#include<iostream>#include<queue>using namespace std;int main(){    priority_queue<int,vector<int>,greater<int> >qe;   //最小堆    qe.push(2);    //插入元素    qe.push(6);    qe.push(1);    cout<<qe.size()<<endl;    //返回队列长度    cout<<qe.top()<<endl;     //返回队头(最大值)    qe.pop();            //删除对头    cout<<qe.top()<<endl;    cout<<qe.empty()<<endl;    //判断队列是否为空    return 0;}

对于自定义类型,则必须自己重载 operator< 或者自己写仿函数

如果要使用priority_queue<node,vector<node>,greater<node> >qe;格式则要重载operator>

例如:

最小堆实现

#include<iostream>#include<queue>using namespace std;struct node{    int x,y;}temp;bool operator>(node a,node b){    return a.x>b.x;}int main(){    priority_queue<node,vector<node>,greater<node> >qe;   //最小堆    for(int i=1;i<=5;i++)    {        temp.x=i;        qe.push(temp);    }    cout<<qe.size()<<endl;    cout<<qe.top().x<<endl;    qe.pop();    cout<<qe.top().x<<endl;    return 0;}

最大堆实现

#include<iostream>#include<queue>using namespace std;struct node{    int x,y;}temp;bool operator<(node a,node b){    return a.x<b.x;}int main(){    priority_queue<node>qe;   //最大堆    for(int i=1;i<=5;i++)    {        temp.x=i;        qe.push(temp);    }    cout<<qe.size()<<endl;    cout<<qe.top().x<<endl;    qe.pop();    cout<<qe.top().x<<endl;    return 0;}

当然也可以这样实现最小堆

#include<iostream>#include<queue>using namespace std;struct node{    int x,y;}temp;bool operator<(node a,node b){    return a.x>b.x;    //关键}int main(){    priority_queue<node>qe;   //最小堆    for(int i=1;i<=5;i++)    {        temp.x=i;        qe.push(temp);    }    cout<<qe.size()<<endl;    cout<<qe.top().x<<endl;    qe.pop();    cout<<qe.top().x<<endl;    return 0;}


1 0
原创粉丝点击