跳转至

结构体

把相关数据放在一起

结构体,是把相关数据放在一起的一种自定义类型。

比如一个学生,有姓名、学号、语文成绩、数学成绩:

struct stu {
    string name;
    int id;
    int chinese, math;
};

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 B = {}; // 这里的name是空串,int成员都是0

img

结构体数组

多个学生,就开一个 stu 数组。

stu a[110];
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 就是一个人的两项数据。

排序前(年龄 身高):
12 150
13 160
12 145

排序后:
13 160
12 145
12 150

image-202509161019198 46

image-20250916101945546

#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。不能写成 >= 或 <=。

常见错误

结构体定义末尾,别漏分号。

struct node {
    int x, y;
}; // 这里有分号

类型名不能当变量名用。

stu.name = "xiaoming"; // 错误:stu是类型
A.name = "xiaoming";   // 正确:A是已定义的变量

访问成员,中间要写点号。

cin >> a[i].math; // 下标为i的学生,他的数学成绩

构造函数(先不看)

构造函数,是创建对象时用来初始化它的特殊函数。

名字与结构体名相同,不写返回值类型。

struct node {
    int x, y;
    node(int x = 0, int y = 0) : x(x), y(y) {}
};
node p(2, 3); // x是2,y是3
node q;       // 使用默认参数,x、y都是0

冒号后面是成员初始化列表。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;
    }
};
sort(a, a + n); // 这里a是上面这种node组成的数组

这里定义的是排序的先后规则,不一定是所有成员的数值都更小。

const node &b 是只读引用,末尾的 const 表示不修改当前对象。学过引用、const 后再细看。

初学时,先把 cmp 的写法用熟。