C++ 對結構體排序 sort函數

很多時候,都會用到排序,在某些情況下,我們需要對結構體進行自定義的排序。

本科的時候覺得大佬們那一行代碼寫的賊漂亮,而我只會 int a[5]; sort(a,a+n);

bool cmp(){};
sort(起始位置,終止位置,cmp);

今天的我居然可以一下子把cmp函數寫出來,實現對結構體數據的自定義排序。這似乎隨着年齡增長,知識也在自己增長,因爲我真的在今天之前沒寫過這個~

我對cmp函數的理解是,比較g和h,如果返回true,那g和h的相對位置就不會變,即g在h前面;如果返回false,h在g前面。

#include <string>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;

typedef struct node{
    int x;
    int y;
    string z;
}node;

bool cmp(node g,node h){
    //先按x升序排序,若x相等,再按z的第一個字符升序排序
    if(g.x!=h.x)
        return g.x<h.x;
    else{
        return g.z[0]<h.z[0];
    }
}
int main(){

    vector<node> a;
    //以下是隨機生成一些數據
    for(int i=5;i>0;i--){
        node tmp;
        tmp.x=i;
        tmp.y=2*i;
        tmp.z="absd";
        a.push_back(tmp);
    }
    for(int i=0;i<5;i++){
        node tmp;
        tmp.x=i;
        tmp.y=i;
        tmp.z="sdfc";
        a.push_back(tmp);
    }
    //輸出原始數據
    for(int i=0;i<a.size();i++)
        printf("%d %d %c\n",a[i].x,a[i].y,a[i].z[0]);
    
    sort(a.begin(),a.end(),cmp);
    //輸出排序後數據
    printf("排序後...\n");
    for(int i=0;i<a.size();i++)
        printf("%d %d %c\n",a[i].x,a[i].y,a[i].z[0]);
    return 0;
}

如果是對常見的數據類型進行排序,就無需自定義cmp,如下

vector<int>a = {2,5,4,3,1};
sort(a.begin(), a.end());//升序(默認)
sort(a.begin(), a.end(), less<int>());//升序排序,相當於cmp(int a,int b){return a<b;}
sort(a.begin(), a.end(), greater<int>());//降序排序

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章