结构体与联合体¶
前置知识¶
变量,sort()函数
目标¶
结构体的定义与访问,构造函数,自定义排序
联合体的定义
结构体的定义¶
结构体(struct)指的是一种数据结构,是一些元素的集合,这些元素成为结构体的成员(member)。可以看作是自定义的数据类型。结构体能显式地将成员变量捆绑在一起展示,更直观。
结构体的成员变量¶
变量名.成员变量名
#include <iostream>
using namespace std;
struct stu{
string name;
int id;
int chinese, math;
};
int main()
{
// 1、结构体变量定义时,依次对成员变量赋值
// 此时,使用的是默认的结构体构造函数
stu A = {"xiaoming", 1001, 90, 95};
// 2、依次给成员变量赋值
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 << '\n';
return 0;
}
/*
xiaoming 1001
xiaohong 1002
*/
结构体的指针¶
此处,或出现在初赛中,平时写代码,较少出现。
#include <iostream>
using namespace std;
struct stu{
string name;
int id;
int chinese, math;
};
int main()
{
stu A = {"xiaoming", 1001, 90, 95};
stu *p = &A; // 定义一个指针
cout << p->name << ' ' << p->id << '\n'; // 通过->访问成员变量
return 0;
}
结构体的构造函数¶
struct构造函数,说白了,就是初始化,更加丰富的初始化
#include <bits/stdc++.h>
using namespace std;
struct node{
int x, y;
node(int x = 0, int y = 0): x(x), y(y){} // 成员初始化表达式列表
};
int main(){
node(2, 3);
return 0;
}
// 构造函数的使用,在一些复杂的代码中,优势就体现出来了。简洁,好写。
// 构造函数的写法,经过查资料,至少有两种写法,上面这种是稳定性更好的,但是让人感觉很陌生的写法
// 多背几遍就是了
结构体的自定义排序¶
sort()默认是从小到大排序,但是结构体里面有很多元素,怎么个排序法呢,这需要我们去定义它
有两种写法,一是重载小于符号,二是写cmp函数
此处是重点,常用
先来理解一下,什么是多关键字的自定义排序
就像Excel表格的时候,有年龄、身高两个关键字
我们排序就要看年龄大的在前面,如果年龄相同,身高小的在前面,类似这样的排序规则
// 除了自定义函数,可以结构体的小于符号重载
// 以下两个代码,实战意义很大,务必熟练操作
// 下面这段代码,看起来很奇怪,可是一定要很熟悉的啊
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct node{
int x, y;
node(int x = 0, int y = 0): x(x), y(y){}
bool operator< (const node& W)const{
if (x == W.x) return y < W.y;
return x < W.x;
}
}a[N];
int n;
int main(){
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i].x >> a[i].y;
sort(a, a + n);
for (int i = 0; i < n; i++) cout << a[i].x << ' ' << a[i].y << '\n';
return 0;
}
// 定义 cmp 函数
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct node{
int x, y;
node(int x = 0, int y = 0): x(x), y(y){}
}a[N];
int n;
bool cmp(node a, node b){
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int main(){
cin >> n;
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;
}
联合体¶
联合体 union
是一种构造类型的数据结构,在一个联合体中可以定义多种不同的数据类型,和结构体相似。
联合体变量可以存入其定义的任何一种数据类型,各成员变量共享一段内存空间,即每次只能赋一种值,赋入新值则覆盖旧值。一个联合体变量占用的空间等于各成员中最大的变量所占用的空间。
结构体和联合体的区别在于:
- 结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;
- 缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
- 而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;
- 但优点是内存使用更为精细灵活,也节省了内存空间。
题单¶
总结¶
结构体的使用,是语言部分熟练掌握的,用法就是这些,没有更多的了
至少以上的知识,够用到提高组了
熟练程度要求:随手就写
参考¶
C++ 结构体(struct)最全详解 - 一杯清酒邀明月 - 博客园
https://fuhailin.github.io/C-CPP-Structer/
C++何时调用构造函数,何时调用析构函数_构造函数和析构函数的调用时机是什么?通常情况下构造函数的作用是什么?-CSDN博客
Struct and union initialization
《信息学奥林匹克词典》
《算法竞赛入门经典(第2版)》
union https://learn.microsoft.com/zh-cn/cpp/cpp/unions?view=msvc-170
C语言union的用法及好处 https://blog.csdn.net/rchris520/article/details/109232732