结构体(struct)
为什么需要结构体
数组是一组具有相同类型的数据的集合。在实际的编程中还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号、年龄为整数,性别为字符,身高,成绩为小数,因为数据类型不同,不能用一个数组来存放。可以使用结构体(struct)来存放一组不同类型的数据。
什么是结构体
结构体是用户自定义的允许存储不同类型数据项的数据结构。( 数组允许存储相同类型数据项的变量)。
结构体的定义形式为
struct 结构体名{
数据类型1 成员名1;
数据类型2 成员名2;
.....
};
//切记分号一定不能忘,这是一条完整的语句!!!
结构体基本用法
创建一个学生结构体
struct student{
string name;//姓名
char gender;//性别
int age;//年龄
double height;//身高
string address;//家庭住址
};
创建结构体变量初始化赋值:
1.统一赋值:使用 { }
Student xiaoming = {"小明",'m',10, 120.5,"陕西省西安市..."};
2.分别赋值:变量名.属性名
Student xiaoming;
xiaoming.name = "小明";
xiaoming.gender = 'm';
xiaoming.age = 10;
xiaoming.height = 120.5;
xiaoming.address = "陕西省西安市...";
结构体数组
#include <bits/stdc++.h>
using namespace std;
const int N=1000;
//可以定义结构体的同时定义结构体变量
struct student{
string name;
int age;
double score;
}stu[N];
//student stu[N];
int main() {
int n;
cin >>n;
for(int i=1;i<=n;i++){
cin>>stu[i].name>>stu[i].age>>stu[i].score;
}
for(int i=1;i<=n; i++){
cout<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].score<<endl;
}
return 0;
}
结构体排序
冒泡排序
可以对结构体变量的整体进行操作,例如swap(stu[j],stu[j+1])
#include <bits/stdc++.h>
using namespace std;
//按照学生的学号从高到低排序
struct student{
int no;
double score;
}stu[101];
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>stu[i].no>>stu[i].score;
}
//冒泡排序
for(int i=1;i<=n-1;i++){
for(int j=1;j<=n-i;j++){
if(stu[j].score<stu[j+1].score){
swap(stu[j],stu[j+1]);
}
}
}
//输出
for(int i=1;i<=n;i++){
cout<<stu[i].no<<" "<<stu[i].score<<endl;
}
return 0;
}
自定义比较函数
// 按照分数从大到小排序
bool cmp(student a, student b){
return a.score > b.score;
}
sort(stu+1,stu+n+1,cmp);
联合体(union)
定义
联合体也称为共用体,是一种数据格式,能够储存不同类型的数据,但同一时间只能储存其中的一种类型数据。
联合体的所有成员共享同一块内存区域,因此在任何时刻只能有效存储一个成员的值。改变其中一个成员的值会覆盖其他成员的值。
#include <bits/stdc++.h>
using namespace std;
union udata{
int a;
double b;
char c;
};
int main() {
udata data;
data.a=10;
cout<<"整型值:"<<data.a<<endl;
data.c = 'A';
cout<<"字符值: "<<data.c<<endl;
// 注意此时data.a的值已改变
cout<<data.a<<endl;
return 0;
}
//输出
整型值:10
字符值: A
65
用途
- 节省内存:当需要在几种不同类型间切换使用同一块内存时。
易错点与避免
- 数据覆盖:由于成员共享内存,修改一个成员会影响其他成员的值。使用时务必清楚当前活跃的是哪个成员。
小结
结构体与联合体的选择
当需要存储不同类型但同时有效的数据时,选择结构体。
当需要在同一内存位置存储不同类型的数据,且一次只使用一种类型时,考虑使用联合体。