前言
其实咱们在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 交换内容
迭代器
不支持迭代器。