优先队列也是一种先进先出的数据结构,元素从队尾入队,从队头出队,但是优先队列相较一般队列多了一个判断优先级的功能,在当前队列中,优先级最高的元素将被第一个删除。
先看一下优先队列的定义
template<class _Ty, class _Container = vector<_Ty>, class _Pr = less<typename _Container::value_type> > class priority_queue
第一个参数就是你要插入的类,比如int,char什么的;
第二个参数是选择容纳元素的容器,该参数默认为vector;
第三个就是比较函数了,它默认是选择"<"这个函数来比较的。这里就开始坑爹了,它是反过来看的,也就是说我们可以看成
if( !cmp() ) { ...// 优先级高,先出列 }
所以如果我们想让元素小的先出列,我们就得反过来定义cmp
class xxx { int id; bool operator < (xxx &a) const { return id > a.id; //当id小于a.id时,返回false,id优先级高于a.id } //所以id先出队 };
一般我们要用自己写的类,直接在结构体内重载"<"函数就行了
但如果我们不使用自己创建的类,而要用标准库里的结构比如int, char之类的怎么办呢,只需要新建一个比较结构体就行了,但这时候要注意,因为优先队列模板是有三个参数,后两个是两个默认参数,所以按c++语法规则:如果你要显式地重新定义第三个参数,则第二个参数也必须被显式指明
struct cmp { bool operator()(int &a, int &b) const { //因为优先出列判定为!cmp,所以反向定义实现最小值优先出列 return a > b; } }; //创建队列的时候,三个参数都要显示地指明 priority_queue<int, vector<int>, cmp> Q;
再加一点吧,每次我都记不住sort默认顺序..
sort函数是默认将元素按升序排列,如果想要按降序,则自己写bool函数即可,不像优先队列要写比较结构体,也不像优先队列那么奇葩要反着写判断函数
bool cmp ( int a, int b ) { return a<b; //返回true,所以a在前面,即降序排列 }