結構體內嵌比較函數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是大於還是小於有參數的。

 

 

 

 

 

 

其他的好像也沒什么了,就先這樣吧,有的話再來補充。

天生沒腦子,個人備忘一下,哈哈哈哈哈哈哈哈哈哈哈哈哈哈

 

溜了,滾去補題。。。

 _(:з」∠)_ 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM