学生们做题的时候经常要输出排序后的结构体。接下来就展示一下怎样对结构体排序。
首先要使用c++头文件#include<algorithm>,我们要用到该头文件中的sort函数
简单介绍一下sort()函数。(会的同学直接跳过)
如果传入两个参数的情况下,默认排序后是从小到大。效果如下
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[4] = { 2,4,1,9 };
sort(a, a + 4);//第一个参数是排序数组开始的地址,第二个是排序截止的地址;
for (int i = 0; i < 4; i++) {
cout << a[i] << " ";
}
}
输出结果如下
这时候有同学要问了,如果要从大到小排序怎么办呢?很简单,再加一个参数就好了,只不过这个参数需要你自己写。先放代码。
// sort展示.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<algorithm>
using namespace std;
bool cmd(int a, int b) {
return a > b;
}
int main()
{
int a[4] = { 2,4,1,9 };
sort(a, a + 4,cmd);//第一个参数是排序数组开始的地址,第二个是排序截止的地址,第三个是自己写的cmd
for (int i = 0; i < 4; i++) {
cout << a[i] << " ";
}
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
效果如下
可以看到这样就是从大到小排序了。关键是观察cmd函数的写法,是bool类型函数,想要从大到小,就写return a>b,想从小到大就写return a<b(虽然没必要)
好啦,sort讲完了就可以讲结构体排序了,与数组排序类似,不过是cmd传入的参数类型换了而已
先放代码
// 结构体排序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<algorithm>
using namespace std;
struct stu {
int id;
int grade;
};
bool cmd(stu a, stu b) {
if (a.grade == b.grade) {
return a.id < b.id;
}
else {
return a.grade > b.grade;
}
}
int main()
{
stu ren[5];
for (int i = 0; i < 5; i++) {
cin >> ren[i].id >> ren[i].grade;
}
sort(ren, ren + 5, cmd);
for (int i = 0; i < 5; i++) {
cout << ren[i].id << " ";
}
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
可以看到我创建了一个学生的结构体,id表示学号,grade代表成绩,按照cmd的写法就可以实现成绩从高到低,如果成绩相同学号小的先输出的效果。
数据源如图
排序后输出结果为
可以看到实现了效果。结构体排序关键在于自己写的cmd函数中的情况划分。每一种情况都划分好自然就可以达到想要的效果。
最后说一句,这是本人第一次在csdn上发表文章,如果有疏漏的地方,请多多包涵,还有疑问可以在评论区询问。如果帮助到你了,麻烦您在评论区打出帮助到我了,谢谢啦。