• 自定义比较器的优先队列


    优先队列是个很方便的东西,然而很多时候本人自己一直搞不清他是大顶堆还是小顶堆,后来在学习中终于明白了;

    优先队列priority_queue<,,>,实际上有三个参数,第一个代表元素类型,第二个是优先队列实现的容器类型,第三个是比较器,我们通常用的只需要输入第一个参数,后面都是默认的;

    实际上完整的是 priority_queue<类型,vector<类型>,less<类型> >;less是从小到大排序,然后优先队列内部其实头指针指在最后面,所以取出来是最大的,我们我们要写小顶堆,那么只要从大到小排序,指针指在最后priority_queue<类型,vector<类型>,greater<类型> >;

    下面是一些小技巧,

    1.如果你依旧是大顶堆,却想要每次得到最小的,我们只要把放入的元素变成变成负数就好了;

    2.或者我们的类型是个结构体,我们可以根据自定义重载小于号,变成大于;

    例如下面这种:

    1 struct node{
    2     int u;
    3     long long dis;
    4     bool operator < (const node &x) const{
    5         return dis>x.dis;
    6     }
    7 }; 
    View Code

    3.我们可以自己定义比较器,这个比较神奇,我只知道大概写法,比较器是个类;重载的是”()“,在优先队列中默认为"<",

    1 class mycmp{
    2     public :
    3         bool operator() (比较的元素类型  a1,比较的元素类型 a2)
    4         {
    5             return   比较的方法; 
    6         }
    7 };

    这里注意重载的是(),就是小于号,得到的重载完后,que.top()是队尾的元素;

  • 相关阅读:
    Go
    Go
    Go -11 Go 框架beego的简单 create run
    文本处理工具之:grep sed awk
    Linux系统布置java项目
    docker 启动mysql 本地连接
    time
    多行查询数据合并成一行进行展示
    settings的使用
    xlsxwriter
  • 原文地址:https://www.cnblogs.com/hjw201983290498/p/12726963.html
Copyright © 2020-2023  润新知