结构体排序的三种方式

方式1 lambda表达式

使用lambda表达式来完成sort()函数的第3个参数,十分优雅,强烈推荐

语法为

[](Student a, Student b){return a.ChineseGrade >= b.ChineseGrade;}

完整程序如下,

#include <iostream>
#include <algorithm>

using namespace std;

struct Student
{
    string name;
    int MathGrade;
    int ChineseGrade;
};


int main()
{

    Student students[5];
    students[0] = {"赵", 10, 20};
    students[1] = {"钱", 20, 40};
    students[2] = {"孙", 50, 30};
    students[3] = {"李", 40, 10};
    students[4] = {"王", 30, 50};
    
    //语文成绩大的学生排在前面,结构体中的变量ChineseGrade
    sort(students, students+5, [](Student a, Student b){return a.ChineseGrade >= b.ChineseGrade;});
    
    for(int i = 0; i < 5; i++)
        cout << "name = " << students[i].name << ", mathgrade = " << students[i].MathGrade << ", chinesegrade = " << students[i].ChineseGrade << endl;
    
    return 0;
}

程序输出为,

name =, mathgrade = 30, chinesegrade = 50
name =, mathgrade = 20, chinesegrade = 40
name =, mathgrade = 50, chinesegrade = 30
name =, mathgrade = 10, chinesegrade = 20
name =, mathgrade = 40, chinesegrade = 10

方式2 重载小于号

在结构体内部重载小于号bool operator < (const Student& tmp) const

#include <iostream>
#include <algorithm>

using namespace std;

struct Student
{
    string name;
    int MathGrade;
    int ChineseGrade;
    //重载小于号,语文成绩大的学生排在前面,结构体中的变量ChineseGrade 
    bool operator< (const Student& tmp) const
    {
        return ChineseGrade > tmp.ChineseGrade;
    }
};


int main()
{

    Student students[5];
    students[0] = {"赵", 10, 20};
    students[1] = {"钱", 20, 40};
    students[2] = {"孙", 50, 30};
    students[3] = {"李", 40, 10};
    students[4] = {"王", 30, 50};
    
    sort(students, students+5);
    
    for(int i = 0; i < 5; i++)
        cout << "name = " << students[i].name << ", mathgrade = " << students[i].MathGrade << ", chinesegrade = " << students[i].ChineseGrade << endl;
    
    return 0;
}

输出为,

name =, mathgrade = 30, chinesegrade = 50
name =, mathgrade = 20, chinesegrade = 40
name =, mathgrade = 50, chinesegrade = 30
name =, mathgrade = 10, chinesegrade = 20
name =, mathgrade = 40, chinesegrade = 10

双条件排序,代码示例如下:

struct projectionRoadboundary {
    double minoffset = 0.0;
    double maxoffset = 0.0;
    int markingid = 0;

    //按照minoffset从小到大排序,如果minoffset相近,则按照maxoffset从小到大排序
    bool operator<(const projectionRoadboundary& tmp) const {
        return minoffset < tmp.minoffset || (abs(minoffset - tmp.minoffset) <= 1e-6 && maxoffset < tmp.maxoffset);
    }
};

方式3 实现cmp()函数

在结构体外写bool cmp(Student a, Student b)函数,

#include <iostream>
#include <algorithm>

using namespace std;

struct Student
{
    string name;
    int MathGrade;
    int ChineseGrade;
};

bool cmp(Student a, Student b)
{
    return a.ChineseGrade > b.ChineseGrade;
}


int main()
{
    Student students[5];
    students[0] = {"赵", 10, 20};
    students[1] = {"钱", 20, 40};
    students[2] = {"孙", 50, 30};
    students[3] = {"李", 40, 10};
    students[4] = {"王", 30, 50};
    
    //语文成绩大的学生排在前面,结构体中的变量ChineseGrade
    sort(students, students+5, cmp);
    
    for(int i = 0; i < 5; i++)
        cout << "name = " << students[i].name << ", mathgrade = " << students[i].MathGrade << ", chinesegrade = " << students[i].ChineseGrade << endl;
    
    return 0;
}

输出为,

name =, mathgrade = 30, chinesegrade = 50
name =, mathgrade = 20, chinesegrade = 40
name =, mathgrade = 50, chinesegrade = 30
name =, mathgrade = 10, chinesegrade = 20
name =, mathgrade = 40, chinesegrade = 10
  • 24
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YMWM_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值