c++使用优先队列时自定义优先出队顺序(和sort)

本文详细介绍了优先队列的数据结构特点及应用方式,包括其模板定义、比较函数的自定义方法,以及如何通过调整比较函数实现不同优先级需求。此外还对比了sort函数的使用。

优先队列也是一种先进先出的数据结构,元素从队尾入队,从队头出队,但是优先队列相较一般队列多了一个判断优先级的功能,在当前队列中,优先级最高的元素将被第一个删除。

先看一下优先队列的定义

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在前面,即降序排列
}

 

转载于:https://www.cnblogs.com/chaoswr/p/8496019.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值