跳转至

结构体

结构体

结构体

结构体是由一组相关的变量组成的复合数据类型。它们可以包含不同类型的数据,并且可以通过点操作符访问其成员。

1. 定义结构体

示例:

struct Student {
    int value;
    double weight;
    string name;
};  // 注意这个分号!这里其实也可以定义结构体的变量、数组

Student s1;   // 定义了Student类型的一个变量
Student s2[105];  // 定义了Student类型的一个数组

结构体定义说明

  • struct 是关键字,用来定义一个新的数据类型。
  • Student 是结构体的名称,可以根据需要自定义。
  • {} 中包含了结构体的成员变量,可以是不同类型。
  • 注意:定义结构体时,最后需要加一个分号。

上面定义了一个名为 Student 的结构体,三个成员元素 value, weight, name,类型分别是 int, double, string。

后续定义了 Student 类型的变量 s1 和 数组 s2,其实还可以定义常量、指针等等,普通数据类型可以做到的事,结构体类型也是可以做到的。

对于结构体类型定义出来的变量,可以理解为其一个变量中就记录了多个信息,比如 s1 里面就有三个数据,并且这些数据可以是不同类型的。

另外,一般结构体的类型名,为了区分一般是首字母大写。

2. 访问/修改结构体成员

访问/修改结构体成员

访问结构体成员可以使用点操作符(.),例如 s1.value 来访问 s1 中的 value 成员。 修改结构体成员也可以使用点操作符,例如 s1.value = 10; 来修改 s1 中的 value 成员。

其实结构体的使用场景和普通变量类似,可以看做是自己定义一个适合我们需要的类型;

结构体数组也是一样的,加上下标即可,下面是简单演示:

#include <bits/stdc++.h>
using namespace std;

struct Student {
    int value;
    double weight;
    string name;
};

Student s1;   // 定义了Student类型的一个变量
Student s2[105];  // 定义了Student类型的一个数组

double sum = 0;

int main() {
    cin >> s1.value >> s1.weight >> s1.name;
    cout << s1.name << " " << s1.weight << '\n';

    for (int i=1; i<=10; i++) {
        cin >> s2[i].value >> s2[i].weight >> s2[i].name;
        sum += s2[i].weight;
    }
    cout << sum;
    return 0;
}

3. 结构体排序

在排序章节我们学习了 sort 的使用,它可以对数组进行排序,那么对于结构体数组该如何进行排序呢?

需要注意的是,结构体是不会自带排序规则的(这个很好理解,一个结构体里常有好几个数据类型,那到底谁说了算呢),所以我们必须自定义排序规则,有两种方式: 1. 外部定义比较函数 2. 重载结构体的比较运算符 通常我们使用第一种方式;

#include <bits/stdc++.h>  
using namespace std;

// 定义一个结构体类型 Student,包含3个成员:value、weight、name
struct Student {
    int value;
    double weight;
    string name;
};

int n;
Student a[1005];  // 定义一个结构体数组,最多存1000个学生

// 比较函数,用于排序时指定规则
// 如果第一个学生的 weight 比第二个大,则返回 true(即排在前面)
bool cmp(Student a1, Student a2) {
    return a1.weight > a2.weight;  // 按照 weight 从大到小排序
}

int main() {
    cin >> n;  // 输入学生人数

    // 输入每个学生的信息:名字、value 和 weight
    for (int i = 1; i <= n; i++) {
        cin >> a[i].name >> a[i].value >> a[i].weight;
    }

    // 使用 sort 对结构体数组从 a[1] 到 a[n] 按 weight 降序排序
    sort(a + 1, a + 1 + n, cmp);

    // 输出排序后的学生信息(名字 和 weight)
    for (int i = 1; i <= n; i++) {
        cout << a[i].name << " " << a[i].weight << '\n';
    }

    return 0;
}

习题

1414: 【基础】期末考试成绩排名

注意

  • 题目要求输出成绩从高到低的排名,如果成绩相同,则按学号升序排列。
#include <iostream>
#include <algorithm>
using namespace std;

// 定义结构体 node,表示一个人的信息:编号id、分数score、姓名name
struct node {
    int id, score;
    string name;
} p[110];  // 定义一个结构体数组,最多保存110个人的信息

// 自定义排序函数
bool cmp(node a, node b) {
    // 如果分数不相同,按分数从高到低排序
    if (a.score != b.score) return a.score > b.score;
    // 如果分数相同,则按编号从小到大排序
    return a.id < b.id;
}

int main() {
    int n;
    cin >> n;  // 输入人数

    // 输入每个人的信息:编号、姓名、分数
    for (int i = 0; i < n; i++) {
        cin >> p[i].id >> p[i].name >> p[i].score;
    }

    // 使用 sort 函数进行排序,按自定义规则 cmp 排序
    sort(p, p + n, cmp);

    // 输出排序后的结果
    for (int i = 0; i < n; i++) {
        cout << p[i].id << " " << p[i].name << " " << p[i].score << endl;
    }

    return 0;
}

1740: 【基础】统计每个数出现的次数

提示

  1. 本题有多种解法,最简单的就是使用数组统计每个数出现的次数。
  2. 还可以使用结构体数组来存储每个数及其出现次数,然后进行排序输出。
  3. 如掌握map容器,可以使用 map 来统计次数。

1. 数组统计

处理策略: 10 2 8 1 2 3 3 6 1 1 1000 先对整体进行排序,使其有序

1 1 1 2 2 3 3 6 8 1000 我们可以从第一个数开始,统计每个数出现的次数,具体统计方法如下:

int cnt = 0;
for(int i=0; i<n; i++){
    cnt ++;
    如果下一个数和当前数不同则输出当前数和出现次数
    重置cnt为0
}
注意这里有一个细节,如果最后一个是单数字,则可能统计补上,所以对最后一个数进行特判 i == n - 1 如果是最后一个数,则输出当前数和出现次数。

2. 结构体数组统计(延伸)

具体策略如下: 10 2 8 1 2 3 3 6 1 1 1000

还是先对整体进行排序,使其有序 1 1 1 2 2 3 3 6 8 1000 然后定义一个结构体,包含两个成员:数字和出现次数。

当遍历到一个新数字时,检查当前数字是否和上一个数字相同,如果相同,则出现次数加1,否则就将当前数字和出现次数存入结构体数组。

⬆ 回到页面顶部
© 2025 dingls | 联系邮箱:dingls@qq.com