• 4.结构体


    一、定义

    结构体可以将任意多不同或者相同的数据类型整合到一个数据类型当中,包括整型、浮点型、字符、数组、指针和结构体自身等等。它可以看作是一种自定义类型,在后续使用时当作如 i n t int int 这样的基本数据类型来使用。一个结构体变量包含定义中所有的变量,每一个变量称为结构体的一个成员

    它的一般形式如下所示:

    struct 名字
    {
        类型 变量名;
        类型 变量名;
        ...
        类型 变量名;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    下面是一个普通的结构体的例子,在这个叫做 node 的结构体中包含了一些常见的数据类型,它有 6 6 6 个成员,其中有两个成员是数组。所以整个结构体总共包含了 204 204 204 个变量。

    struct node
    {
    	int a;
    	float b
    	double c;
    	string d;
    	int e[100];
    	int f[100];
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、赋值与使用

    可以使用多种方式定义结构体变量,把它当作一种基本数据类型来使用,名字叫做 node。

    • 可以在分号前面定义,作为全局变量:

      struct node
      {
          ll x,y;
      }a;
      
      • 1
      • 2
      • 3
      • 4
    • 也可以像其他的类型一样定义全局变量和局部变量:

      struct New
      {
          ll x,y;
      };
      New p,q;
      int main()
      {
          New temp;   
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 结构体也可以定义为数组,这样每一个元素都是一个结构体变量,包含所有成员:

      struct ano
      {
          ll x,y;
      }b[maxn];
      
      • 1
      • 2
      • 3
      • 4

    对结构体进行赋值的方式也有很多种:

    • 可以用大括号的方式对每一个域进行赋值
    • 也可以使用.展开每一个域来分别赋值
    • 同样两个相同类型的变量可以相互赋值
    #include 
    #include 
    
    using namespace std;
    typedef long long ll;
    
    struct node
    {
    	int a;
    	float b; 
    	double c;
    }z[100];
    node temp;
    int main()
    {
    	node x,y={2,4.0,5.2};
        x.a=1;x.b=2.0;x.c=3.2;
        cout<<x.a<<" "<<x.b<<" "<<x.c<<endl;
        cout<<y.a<<" "<<y.b<<" "<<y.c<<endl;
        temp=x;
        
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    三、使用sort排序

    1.cmp函数

    对于结构体的排序我们需要使用到cmp函数来帮助我们定义相互之间的大小关系。

    #include 
    #include 
    
    using namespace std;
    struct node
    {
    	int a;
    	float b; 
    	double c;
    }z[100];
    bool cmp(node x,node y)
    {
        if(x.a != y.a)
            return x.a < y.a;//以a域从小到大排序
       	else if(x.b != y.b)
            return x.b < y.b;//以b域从小到大排序
        return x.c<y.c;//以c域从小到大排序
    }
    int main()
    {
    	int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>z[i].a>>z[i].b>>z[i].c;
        sort(z+1,z+1+n,cmp);//对数组下标1到n进行排序
        for(int i=1;i<=n;i++)
            cout<<z[i].a<<" "<<z[i].b<<" "<<z[i].c<<endl;
        
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    使用cmp函数的优势在于,如果需要对一个结构体进行多种方式的排序,只需要多写几个不同的cmp函数即可。

    2.重载运算符

    除此以外我们还可以使用重载<的方式来规定结构体变量的大小关系,因为sort函数的实现就是依靠<。重载运算符在一些 S T L STL STL的数据结构中使用得非常频繁。

    重载运算符之后依然可以使用cmp函数,两者并不冲突。

    #include 
    #include 
    
    using namespace std;
    struct node
    {
    	int a;
    	float b; 
    	double c;
    	bool operator<(const node &x)const
    	{
    		if(a!=x.a)
    			return a<x.a;
    		else if(b!=x.b)
    			return b<x.b;
    		return c<x.c;
    	}
    }z[100];
    int main()
    {
    	int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>z[i].a>>z[i].b>>z[i].c;
        sort(z+1,z+1+n);
        for(int i=1;i<=n;i++)
            cout<<z[i].a<<" "<<z[i].b<<" "<<z[i].c<<endl;
        
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    四、作业

    P1093 [NOIP2007 普及组] 奖学金

    P5740 【深基7.例9】最厉害的学生

    P5741 【深基7.例10】旗鼓相当的对手 - 加强版

    P5742 【深基7.例11】评等级

    P1068 [NOIP2009 普及组] 分数线划定

    P1104 生日

    P1781 宇宙总统

  • 相关阅读:
    数据结构之堆
    要做好解决方案工程师,这些核心技能是必须要掌握的。
    Mysql——使用字符集以及校对
    【深度学习】——深度学习中的梯度计算
    学术论文写作
    c语言练习74: 分割数组中数字的数位
    xxl-job 执行成功,但是报“任务结果丢失,标记失败“错误
    益华世科技EVASH品牌EEPROM芯片新品发布会
    【Git-2022总结】分布式代码版本控制工具【GitHub/Gitee/GitLab】
    Unity之OpenXR+XR Interaction Toolkit快速监听手柄任意按键事件
  • 原文地址:https://blog.csdn.net/qq_40760407/article/details/128053264