结构体¶
把相关数据放在一起¶
结构体,是把相关数据放在一起的一种自定义类型。
比如一个学生,有姓名、学号、语文成绩、数学成绩:
stu 是类型名,里面的 name、id 等,叫作成员变量。使用 string,需要头文件 <string>。
结构体定义结束,大括号后面有分号。
定义变量与访问成员¶
stu 是类型,A、B 是这个类型的变量,就像 int 是类型,a、b 可以是整数变量。
成员访问,写成 变量名.成员名。
#include <iostream>
#include <string>
using namespace std;
struct stu {
string name;
int id;
int chinese, math;
};
int main() {
stu A = {"xiaoming", 1001, 90, 95};
stu B;
B.name = "xiaohong";
B.id = 1002;
B.chinese = 99;
B.math = 92;
cout << A.name << ' ' << A.id << '\n';
cout << B.name << ' ' << B.id;
return 0;
}
大括号初始化,按成员定义的顺序对应。也可以先定义,再逐个赋值。
普通局部变量 stu B,里面的 int 成员不会自动变成 0。 没赋值之前,不要直接拿来计算。

结构体数组¶
多个学生,就开一个 stu 数组。
int n;
cin >> n; // 0 <= n <= 100
for (int i = 0; i < n; i++)
cin >> a[i].name >> a[i].id >> a[i].chinese >> a[i].math;
for (int i = 0; i < n; i++) cout << a[i].name << ' ' << a[i].math << '\n';
a[i] 是下标为 i 的学生,a[i].math 是他的数学成绩。下标从 0 开始,a[0] 是第一个学生。
自定义排序(重点)¶
结构体有多个成员,排序时要说清楚:先比什么,相同时再比什么。
下面换一个例子,每人记录年龄、身高,作为排序的两个关键字。
年龄大的在前;年龄相同,身高小的在前。
x 表示年龄,y 表示身高,代码里的 a[i].x、a[i].y 就是一个人的两项数据。


#include <iostream>
#include <algorithm>
using namespace std;
struct node {
int x, y;
};
node a[110];
bool cmp(node a, node b) {
if (a.x != b.x) return a.x > b.x;
return a.y < b.y;
}
int main() {
int n;
cin >> n; // 0 <= n <= 100
for (int i = 0; i < n; i++) cin >> a[i].x >> a[i].y;
sort(a, a + n, cmp);
for (int i = 0; i < n; i++) cout << a[i].x << ' ' << a[i].y << '\n';
return 0;
}
年龄不同,直接按年龄排;年龄相同,再按身高排。 别把两个条件直接用 && 拼起来。
所有关键字都相同,cmp 返回 false。不能写成 >= 或 <=。
常见错误¶
结构体定义末尾,别漏分号。
类型名不能当变量名用。
访问成员,中间要写点号。
构造函数(先不看)¶
构造函数,是创建对象时用来初始化它的特殊函数。
名字与结构体名相同,不写返回值类型。
冒号后面是成员初始化列表。x(x) 左边是成员名,括号里面是参数名。
默认参数、初始化列表,先能看懂就行。初学时,用前面的大括号初始化。
重载小于号(先不看)¶
还可以在结构体里定义“小于”的规则,再直接使用 sort。
struct node {
int x, y;
bool operator<(const node &b) const {
if (x != b.x) return x > b.x;
return y < b.y;
}
};
这里定义的是排序的先后规则,不一定是所有成员的数值都更小。
const node &b 是只读引用,末尾的 const 表示不修改当前对象。学过引用、const 后再细看。
初学时,先把 cmp 的写法用熟。