zoukankan      html  css  js  c++  java
  • 结构体内嵌比较函数bool operator < (const node &x) const {}

    关于结构体内嵌比较函数:

    一般情况下:

    1 struct node
    2 {
    3     int l,r;
    4     bool operator <(const node &a)const{
    5         return r < a.r;
    6     }
    7 }a[maxn];

    直接写比较函数是裸的r表示当前的值,如果r<a.r,那么就是从小到大排序,但是优先队列的是相反的

    sort默认为从小到大排序,优先队列默认为从大到小。

    1 struct node
    2 {
    3     int l,r;
    4     bool operator <(const node &a)const
    5     {
    6         return r>a.r;
    7     }
    8 };
    9 priority_queue<node> q;

    那么这个优先队列是按r小的优先出队。

     结构体内嵌比较函数的使用就是直接sort就可以,sort(a,a+n);

    当然也可以直接写一个比较的函数:

    1 bool cmp(node a,node b){
    2 
    3   return a.r<b.r;
    4 
    5 }

    用法就是sort(a,a+n,cmp);

    但是这种排序的方法比结构体内嵌比较函数的慢很多,有的时候超时可能就是排序写挫了。

    ----------------------------------------------------------------我叫分割线-------------------------------------------------------

    以上只是按照一个变量排序的,如果我两个变量都考虑,那怎么排序的呢?

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct node{
     4     int l,r;
     5 
     6     bool operator < (const node &x) const {
     7         if(l<=r&&x.l> x.r) return true;
     8         if(l> r&&x.l< x.r) return false;
     9         if(l<=r&&x.l<=x.r) return l<x.l;
    10         if(l> r&&x.l> x.r) return r>x.r;
    11         //return false;
    12     }
    13 }a[100];
    14 
    15 int main()
    16 {
    17     int n;
    18     scanf("%d",&n);
    19     for(int i=1;i<=n;i++)
    20         scanf("%d%d",&a[i].l,&a[i].r);
    21     sort(a+1,a+1+n);
    22     for(int i=1;i<=n;i++)
    23         cout<<a[i].l<<" "<<a[i].r<<endl;
    24 }

    就用上面的代码举栗子吧。

    假设我要比较的数列为:

    (l,r): (1,3) (4,3) (5,6) (8,2) (7,1) 那么我按照以上代码排序,排完序之后的数列是什么样的呢?

      (1,3) (5,6) (4,3) (8,2) (7,1) 

    发现什么了吗?为什么要用两种颜色标记呢?蓝色的都是l<=r的,粉色的都是l>r的,排序的时候,没有参数的l,r比有参数的x.l,x.r的级别高,就相当于是比较的时候的第一个数。

    bool operator < (const node &x) const {
            if(l<=r&&x.l> x.r) return true;
            if(l> r&&x.l< x.r) return false;
            if(l<=r&&x.l<=x.r) return l<x.l;
            if(l> r&&x.l> x.r) return r>x.r;
            //return false;
        }

    再看一下代码:当我比较的两个数,一个是l<=r的,另一个是l>r的,按照没有参数的为主,看返回的是true还是false。

    如果为if(l<=r&&x.l> x.r) return true;

       if(l> r&&x.l<=x.r) return false;    那么l<=r的数都在l>r的数的前面。

    所以返回true还是false的作用是把数分成两类,看l<=r的在前面还是l>r的在前面,

    if(l<=r&&x.l> x.r) return true;

    if(x.l> x.r&&l< r)   return true;

    是一样的,这个的顺序并不影响排序的结果。

    但是如果我写的是if(l<=r&&x.l> x.r) return false;

            if(l> r&&x.l<=x.r) return true;

    那么我返回的就是l>r的在l<=r的数的前面。

    然后继续,对于相同的l<=r或者l>r的数而言,我就根据返回的是按照l的大小比较还是r的大小比较就看我返回的是什么。

    按上面的例子,if(l<=r&&x.l<=x.r) return l<x.l;

           if(l>  r&&x.l>  x.r) return r>x.r;

    那么对于l<=r的数而言,谁的l更小谁在前面,对于l>r的而言,谁的r更大谁在前面。

    而且if(l<=r&&&x.l<=x.r) return l<x.l;

       if(l<[r&&x.l<=x.r) return x.l>l;

    是一样的,看没有参数的l是大于还是小于有参数的。

    其他的好像也没什么了,就先这样吧,有的话再来补充。

    天生没脑子,个人备忘一下,哈哈哈哈哈哈哈哈哈哈哈哈哈哈

    溜了,滚去补题。。。

     _(:з」∠)_ 

  • 相关阅读:
    win7开启Administrator账户
    二叉树遍历
    使用NAnt提高工作效率(二)
    系统服务的最简单实现
    右键附加启动命令行
    C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
    百度原CTO李一男经典语录
    Sql开发技巧
    使用NAnt提高工作效率(一)
    对获取config文件的appSettings节点简单封装
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9347296.html
Copyright © 2011-2022 走看看