8.结构体

一、定义

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

它的一般形式如下所示:

struct 名字
{
    类型 变量名;
    类型 变量名;
    ...
    类型 变量名;
};

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

struct node
{
	int a;
	float b
	double c;
	string d;
	int e[100];
	int f[100];
};

二、赋值与使用

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

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

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

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

    struct ano
    {
        ll x,y;
    }b[maxn];
    

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

  • 可以用大括号的方式对每一个域进行赋值
  • 也可以使用.展开每一个域来分别赋值
  • 同样两个相同类型的变量可以相互赋值
#include <iostream>
#include <algorithm>

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

三、使用sort排序

1.cmp函数

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

#include <iostream>
#include <algorithm>

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

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

2.重载运算符

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

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

#include <iostream>
#include <algorithm>

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

四、作业

P1093 [NOIP2007 普及组] 奖学金

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

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

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

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

P1104 生日

P1781 宇宙总统

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值