先说sort
,sort排序默认是升序,如果想降序,需要重写sort的第三个参数。
参考链接:C++使用sort函数进行自定义排序
//理解记忆:> 说明大的排在前面,即降序
bool cmp(node x, node y) {
return x.a > y.a;
}
sort(v.begin(),v.end(),cmp);
通过上面的代码,就可以实现对数组v进行降序排序,注意cmp中的是 >
,即通过>
实现了降序。接下来和priority_queue进行比较。
再来说一下priority_queue
。
参考链接:c++优先队列(priority_queue)用法详解
定义:
priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
//降序队列,大顶堆,默认方式
//理解记忆:less是越来越小的意思,即降序,队头的数是最大的数,即大顶堆
priority_queue <int,vector<int>,less<int> >q;
//升序队列,小顶堆,非默认方式
//理解记忆:greater是越来越大的意思,即升序,队头的数是最小的数,即小顶堆
priority_queue <int,vector<int>,greater<int> > q;
priority_queue
的自定义排序
方式1:运算符重载<
struct tmp1{
int x;
tmp1(int a) {x = a;}
bool operator<(const tmp1& a) const {
return x < a.x; //大顶堆
}
};
方式2:重写仿函数
struct comp{
bool operator() (tmp1 a, tmp1 b){
return a.x < b.x; //大顶堆
}
};
通过上面两种方式,实现了priority_queue
的自定义排序。可以发现,两种方式中都是实现了大顶堆,而且是通过<
实现的,我们直到大顶堆是降序的。
比较priority_queue
的自定义排序与sort
的自定义排序,可以发现,对于实现的都是降序的做法是不同的,sort
是使用>
,二priority_queue
是使用<
。
之前一直弄混,现在明白了。