优先队列 priority_queue

用堆结构实现的优先队列priority_queue

优先队列具有队列的所有特性,在这基础上添加了内部的一个排序,本质是堆实现的

参数模版
//priority_queue< type, container, function >

这三个参数,后面两个可以省略,第一个不可以。
其中:

  • type:数据类型;
  • container:实现优先队列的底层容器;
  • function:元素之间的比较方式;

对于container,要求必须是数组形式实现的容器,例如vector、deque,而不能使list。
在STL中,默认情况下(不加后面两个参数)是以vector为容器,以 operator< 为比较方式,所以在只使用第一个参数时,优先队列默认是一个最大堆,每次输出的堆顶元素是此时堆中的最大元素。

成员函数

假设type类型为int,则:

  • bool empty() const
    返回值为true,说明队列为空;
  • int size() const
    返回优先队列中元素的数量;
  • void pop()
    删除队列顶部的元素,也即根节点
  • int top()
    返回队列中的顶部元素,但不删除该元素;
  • void push(int arg)
    将元素arg插入到队列之中;
1.当使用基本数据类型(如int)时

需要注意的是,如果使用less<int>greater<int>,需要头文件:

  • #include <functional>
//默认大顶堆
priority_queue<int> a;
//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
2.对于自定义类型,需要对运算符重载、重写仿函数
//方法1(仍然利用默认funtional,但是需要重载其中的 <运算符 来实现对自定义类型的比较)(这种方法只能使用带一个参数的模版声明对象,不能使用less<tmp1>和greater<tmp1>,)
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大顶堆
    }
};

tmp1 a(1);
tmp1 b(2);
tmp1 c(3);
priority_queue<tmp1> d;//priority_queue<tmp1,vector<tmp1>
d.push(b);
d.push(c);
d.push(a);
//此时d.top == c(3)

//方法2(可以使用带三个参数的模版声明对象了)
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大顶堆
    }
};
struct cmp //重写仿函数
{
    bool operator() (tmp1 a, tmp1 b) 
    {
        return a.x < b.x; //大顶堆
    }
};
priority_queue<rmp1,vector<tmp1>,tmp2> f;


参考文章:
https://blog.csdn.net/lym940928/article/details/89635690

posted @ 2020-10-07 17:07  鸵鸟洵  阅读(153)  评论(0编辑  收藏  举报