跳转至

结构体与联合体

前置知识

变量,sort()函数

目标

结构体的定义与访问,构造函数,自定义排序

联合体的定义

结构体的定义

结构体(struct)指的是一种数据结构,是一些元素的集合,这些元素成为结构体的成员(member)。可以看作是自定义的数据类型。结构体能显式地将成员变量捆绑在一起展示,更直观。

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

结构体的成员变量

变量名.成员变量名

#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
*/

img

结构体的指针

此处,或出现在初赛中,平时写代码,较少出现。

#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;
}

img

结构体的构造函数

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表格的时候,有年龄、身高两个关键字

我们排序就要看年龄大的在前面,如果年龄相同,身高小的在前面,类似这样的排序规则

img

// 除了自定义函数,可以结构体的小于符号重载
// 以下两个代码,实战意义很大,务必熟练操作
// 下面这段代码,看起来很奇怪,可是一定要很熟悉的啊

#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 是一种构造类型的数据结构,在一个联合体中可以定义多种不同的数据类型,和结构体相似。

union Data {
    int num;
    float value;
    char symbol;
};
union Data data;

联合体变量可以存入其定义的任何一种数据类型,各成员变量共享一段内存空间,即每次只能赋一种值,赋入新值则覆盖旧值。一个联合体变量占用的空间等于各成员中最大的变量所占用的空间。

结构体和联合体的区别在于:

  • 结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;
  • 缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
  • 而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;
  • 但优点是内存使用更为精细灵活,也节省了内存空间。

题单

病人排队 - Virtual Judge

1938:【07NOIP普及组】奖学金

1946:【09NOIP普及组】分数线划定

总结

结构体的使用,是语言部分熟练掌握的,用法就是这些,没有更多的了

至少以上的知识,够用到提高组了

熟练程度要求:随手就写

参考

结构体 - OI Wiki

C++ struct与class-阿里云开发者社区

C++ 结构体(struct)最全详解 - 一杯清酒邀明月 - 博客园

C++ - 结构体构造函数使用总结

https://fuhailin.github.io/C-CPP-Structer/

C++何时调用构造函数,何时调用析构函数_构造函数和析构函数的调用时机是什么?通常情况下构造函数的作用是什么?-CSDN博客

Struct and union initialization

struct (C++)

构造函数 (C++)

《信息学奥林匹克词典》

《算法竞赛入门经典(第2版)》

union https://learn.microsoft.com/zh-cn/cpp/cpp/unions?view=msvc-170

C语言union的用法及好处 https://blog.csdn.net/rchris520/article/details/109232732