#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 函数中的 > 改成 < 就可以啦,自己试一试吧~