C++ priority_queue使用解析

前言

其实咱们在TopK问题中已经介绍了优先队列这么个东西,还是蛮不错的,这次咱们仔细了解一下c++的priority_queue是如何使用的。

参数

包括仨,其中后两个是默认参数,从左到右依次是:元素类型T,默认容器(这里是vector)、默认比较大小方式(这里默认是less,即大的元素在上面)。

更换插入的比较方法

这就是要修改第三个默认参数了,那么咱们必须得把第二个参数写的明明白白的。
priority_queue<T, vector, greater > 这就非常简单,greater就把优先队列的头部变成最小元素了。
如果咱们对这俩比较函数不满意,那么咱们如何自己写一个比较函数呢?其实就是重载<操作符。写一个:

bool operator<(T a, T b)
{
	if(a.x == b.x)  return a.y >= b.y;
    else return a.x > b.x;
}

咱们分析一下这表达的是啥意思。首先T a是new comer,当元素进行插入操作时是从优先队列的底部先插入,然后冒泡上去,直到new comer与队列中的元素做比较时返回true才会停下来。像我写的这个,很显然,新来的家伙只要觉得自己够大了就返回true,那么它肯定就会止步不前,于是小的家伙就都跑到顶部了,于是这就是个小顶堆。
另外,咱们好歹看看人家less是咋实现的,咱们借鉴一下:

template <class T> struct less {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

看到以后就清楚了,很显然,输入值不能被改变,加上const属性,然后用引用的方式避免拷贝,很棒。所以咱上面的函数得稍微改改。

一些操作

和队列基本操作相同:
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头元素
swap 交换内容

迭代器

不支持迭代器。

猜你喜欢

转载自blog.csdn.net/weixin_44039270/article/details/106807379