结构体内嵌比较函数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是大于还是小于有参数的。
其他的好像也没什么了,就先这样吧,有的话再来补充。
天生没脑子,个人备忘一下,哈哈哈哈哈哈哈哈哈哈哈哈哈哈
溜了,滚去补题。。。
_(:з」∠)_