高北-小学进阶-L2-结构体&结构体排序
2026-10-16 17:37:50
发布于:广东
C++ 信奥小课堂笔记(结构体和结构体排序)
今天关键词: 结构体、成员、结构体数组、访问成员、cmp、结构体排序
小提醒:结构体就像一个“档案袋”,把同一个对象的多个信息装在一起。排序时关键在
cmp怎么写。
一、为什么需要结构体?
比如一个学生有:
- 姓名
- 年龄
- 身高
- 体重
如果分开用几个数组存:
string name[1010];
double age[1010];
double height[1010];
double weight[1010];
很容易出现“名字和年龄对不上”的问题。
结构体就是把同一个对象的多个信息打包在一起,像一个档案袋:
一个学生一个档案袋,里面装着姓名、年龄、身高、体重。
这样数据就不会乱,也不会不匹配。
二、结构体的定义语法
struct 结构体名 {
成员表;
} 变量名, 数组名;
例子:
struct stu {
double age, height, weight;
string name;
} s, s1[1010];
也可以先定义结构体类型,再单独定义变量:
struct stu {
double age, height, weight;
string name;
};
stu s, s1[1010];
大白话:
struct:我要开始做一个“档案袋模板”了。stu:这个模板的名字。{ }:里面写这个档案袋要装哪些信息。age, height, weight, name:这些叫成员,就是档案袋里的每一栏。s:一个具体的档案袋变量。s1[1010]:一个档案袋数组,可以装 1010 个学生档案。
注意:结构体定义最后的大括号后面,必须加分号 ;。
三、专业词大白话翻译
| 专业词 | 大白话 |
|---|---|
| 结构体 | 档案袋、信息卡片 |
| 成员 | 档案袋里的每一栏,比如姓名、年龄 |
| 结构体变量 | 一个具体的档案袋 |
| 结构体数组 | 一排档案袋,每个袋子装一个对象 |
| 访问成员 | 打开档案袋,看某一栏 |
cmp |
排序时用的比较规则 |
四、定义结构体变量和数组
stu s; // 一个学生档案袋
stu s1[1010]; // 一排学生档案袋,最多 1010 个
大白话:
stu s;:准备一个stu类型的盒子,名字叫s。stu s1[1010];:准备 1010 个stu类型的盒子,合起来叫s1。
五、访问结构体成员
访问成员用点号 .,读作“的”。
语法:
变量.成员名;
数组名[下标].成员名;
例子:
s.age = 12;
s.name = "小明";
s1[1].age = 11;
s1[1].name = "小红";
大白话:
s.age:s这个档案袋的年龄那一栏。s1[1].name:第 1 个档案袋的姓名那一栏。
访问出来的成员,就等同于一个普通变量,可以输入、输出、计算。
cin >> s1[i].name >> s1[i].age;
cout << s1[i].name << " " << s1[i].age;
六、结构体排序
结构体排序和普通数组排序很像,用 sort。
关键:写 cmp 比较规则函数。
cmp 的参数类型要和要排序的数组类型一致。
1. 按年龄升序排序
bool cmp(stu a, stu b) {
return a.age < b.age; // 年龄小的排前面
}
sort(s1 + 1, s1 + n + 1, cmp);
大白话:
a和b是两个学生档案袋。a.age < b.age:如果a的年龄比b小,a就排在前面。- 这样排出来就是从年龄小到大。
2. 按分数降序排序
bool cmp(stu a, stu b) {
return a.score > b.score; // 分数高的排前面
}
sort(s1 + 1, s1 + n + 1, cmp);
大白话:
a.score > b.score:如果a的分数比b高,a就排在前面。- 这样排出来就是从高分到低分。
3. sort 区间小提醒
sort(s1 + 1, s1 + n + 1, cmp);
- 从
s1[1]排到s1[n]。 - 终点要写
s1 + n + 1,因为sort是左闭右开。 - 要加
#include <algorithm>。
七、完整小例子
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct stu {
string name;
int score;
};
bool cmp(stu a, stu b) {
return a.score > b.score; // 分数高的排前面
}
int main() {
int n;
cin >> n;
stu s[1010];
for (int i = 1; i <= n; i++) {
cin >> s[i].name >> s[i].score;
}
sort(s + 1, s + n + 1, cmp);
for (int i = 1; i <= n; i++) {
cout << s[i].name << " " << s[i].score << "\n";
}
return 0;
}
大白话:
- 做一个学生档案袋模板,里面装姓名和分数。
- 输入 n 个学生。
- 用
cmp按分数从高到低排序。 - 输出排好序的学生姓名和分数。
八、容易错的地方
- 结构体定义最后的分号
;不能丢。 - 访问成员用点号
.,不是逗号,也不是箭头。 - 数组访问成员:
s[i].name,不要写成s.name[i]。 cmp的参数类型要和结构体类型一致。cmp返回类型是bool。sort的终点要 +1。- 升序用
<,降序用>。 - 要加
#include <algorithm>。 - 结构体类型名和变量名不要搞混。
九、记忆小口诀
结构体,像档案,
多个信息装一起;
定义最后别忘分号;
点号访问成员,
数组下标别忘记;
排序关键写 cmp,
类型一致返回 bool;
升序小于降序大于,
sort 终点加个一。
十、课后小练习
- 定义一个学生结构体,包含姓名、年龄、分数。
- 输入 3 个学生信息,输出他们的姓名和分数。
- 按分数从高到低排序,输出排序后的结果。
- 按年龄从小到大排序,输出排序后的结果。
- 说说下面代码哪里错了:
struct stu {
string name;
int score;
}
bool cmp(stu a, stu b) {
return a.score > b.score;
}
sort(s + 1, s + n, cmp);
今日一句话总结:
结构体是装多个信息的档案袋,成员用点号访问;结构体数组就是一排档案袋;结构体排序用 sort,关键在写 cmp,参数类型要和结构体一致,升序用 <,降序用 >,终点记得加 1。
这里空空如也











有帮助,赞一个