博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构体内嵌比较函数bool operator < (const node &x) const {}
阅读量:5143 次
发布时间:2019-06-13

本文共 2522 字,大约阅读时间需要 8 分钟。

 

 

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

 

一般情况下:

1 struct node2 {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 node2 {3     int l,r;4     bool operator <(const node &a)const5     {6         return r>a.r;7     }8 };9 priority_queue
q;

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

 

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

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

1 bool cmp(node a,node b){2 3   return a.r

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

 

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

 

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

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

 

1 #include
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
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<
<<" "<
<

 

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

假设我要比较的数列为:

(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
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是大于还是小于有参数的。

 

 

 

 

 

 

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

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

 

溜了,滚去补题。。。

 _(:з」∠)_ 

 

转载于:https://www.cnblogs.com/ZERO-/p/9347296.html

你可能感兴趣的文章
PHP压缩文件操作
查看>>
Java数据结构和算法(四)--链表
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
由级别和性格特征将程序员分类 ---看看你属于哪一种
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
洛谷 P3237 [HNOI2014]米特运输
查看>>
Attributes.Add用途与用法
查看>>
JavaScript面向对象初探——封装和继承
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>