priority_queue的用法

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

 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值