#Z0511. [伴随编程]结构体数组的排序

[伴随编程]结构体数组的排序

程序:

#include <iostream>
#include <string>

using namespace std;
struct Student {
    string name;
    int score[4];
};

int main() {
    Student stu[3];
    for (int i = 0; i < 3; i++) {
        cin >> stu[i].name;
        for (int j = 0; j < 4; j++) {
            cin >> stu[i].score[j];
        }
    }
  
    return 0;
}

在这里我们想把学生以及它的成绩作为一个整体进行排序。排序的依据是:

当第一个成绩高的时,第一个成绩高的排在前面;

当第一个成绩相同时,第二个成绩高的排在前面;

当前两个成绩相同时,第三个成绩高的排在前面;

当前三个成绩相同时,第四个成绩高的排在前面。

这时候,要使用 sort 函数,需要先引入 <algorithm>

因为我们的 Student 类型是自己用结构体定义出来的,他的大小关系是没有默认定义的,所以我们要在 main 函数之前,结构体 Student 的定义之后,自己定义一个用于比较的 cmp 函数:

bool cmp(Student x, Student y) { 
    if (x.score[0] != y.score[0]) { 
        return x.score[0] > y.score[0]; 
    } 
    if (x.score[1] != y.score[1]) { 
        return x.score[1] > y.score[1]; 
    } 
    if (x.score[2] != y.score[2]) { 
        return x.score[2] > y.score[2]; 
    } 
    return x.score[3] > y.score[3]; 
}

接下来,我们只要在完成读入后,以 cmp 为排序依据调用一下 sort并把被排序的学生数组传入一下就可以了:

sort(stu, stu + 3, cmp);

最后,让我们输出一下排序后的学生列表:

for (int i = 0; i < 3; i++) { 
    cout << stu[i].name << ": "; 
    for (int j = 0; j < 4; j++) { 
        cout << stu[i].score[j] << " "; 
    } 
    cout << endl; 
}

现在点击 运行,输入三个学生的名字和每个人的四门成绩(想清楚再输入,别犯错误喔),看一看排序后的结果是不是符合预期的呢?

如果想按照成绩低的排在前面,只需要把 cmp 函数中的 > 改成 < 就可以啦,自己试一试吧~