结构体
结构体
结构体
结构体是由一组相关的变量组成的复合数据类型。它们可以包含不同类型的数据,并且可以通过点操作符访问其成员。
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: 【基础】统计每个数出现的次数
提示
- 本题有多种解法,最简单的就是使用数组统计每个数出现的次数。
- 还可以使用结构体数组来存储每个数及其出现次数,然后进行排序输出。
- 如掌握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,否则就将当前数字和出现次数存入结构体数组。