• c++使用优先队列时自定义优先出队顺序(和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在前面,即降序排列
    }
  • 相关阅读:
    C# 印刷文字识别-营业执照
    C# 印刷文字识别-身份证识别
    web视频点播平台
    web书籍信息管理系统
    web数字图书馆系统
    web文件监控系统
    web陶瓷商城管理系统
    web物品交易管理系统
    web校园单车管理平台
    web校园二手物品管理平台
  • 原文地址:https://www.cnblogs.com/chaoswr/p/8496019.html
Copyright © 2020-2023  润新知