NEFU OJ 出生日期 2068 结构体的初碰

本文深入讲解C++中结构体的定义与使用,以及sort函数的详细应用,包括如何自定义比较函数来实现复杂数据类型的排序。通过具体实例,帮助读者掌握结构体排序的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NEFU OJ 2068 出生时间


#include <bits/stdc++.h>//万能头文件

using namespace std;//不知道干啥的

struct student{//struct+结构体名
    char s[100];//结构体中可定义多种变量
    int y,m,d,sx;
};//此处也可写为 }str[100]},这时,下文******一行则不用再写
bool cmp(student a,student b){//cmp函数用来compare, bool+函数名(结构体名+随意符号1,结构体名+随意符号2 
    if(a.y!=b.y) return a.y<b.y;//年 输出较小的值
    else if(a.m!=b.m) return a.m<b.m;//月
    else if(a.d!=b.d) return a.d<b.d;//日
    else if(a.sx!=b.sx) return a.sx>b.sx;//输入靠后的同学先输出
}
int main()
{
    int n,i;
    student str[500];//******
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%s %d %d %d",&str[i].s,&str[i].y,&str[i].m,&str[i].d);//
        str[i].sx=i;//记录每位同学的输入位次
    }
    sort(str+1,str+1+n,cmp);//sort函数,见下文解析
    for(i=1;i<=n;i++)
        printf("%s\n",str[i].s);
    return 0;
}

sort函数

性质

···sort是c++自带函数
···复杂度 n*log(n)
···包含在头文件
···#include的c++标准库里
···函数有三个参数
···1.要排序的数组的起始地址
···2.数组的结束地址
···3.第三个参数是排序的方法,可以不写,默认是从小到大

举例1

···sort(a,a+n) -----默认从小到大排序
···比如 int a[ ]={2,7,1,5,0} 五个数
···我们可以写成 sort(a,a+5)·······a为数组名
···从小到大排序可以写成
···sort(a,a+n,less<要进行排序的数据类型>())
···从大到小排序可以写成
···sort(a,a+n,greater<要进行排序的数据类型>())

举例2

···结构体排序
···我们定义一个结构体
···typedef struct stu
···{ int xuehao;
··· int chengji;
···}stu;
···stu p[20];
···如果我们要按成绩排序
···可以写成sort(p,p+20,cmp1)

cmp函数的写法

举例1

比如我们要按成绩排序从高到低
bool cmp1(stu a,stu b)
{
return a.chengji>b.chengji;
}
刚才的int数组从小到大排序,我们还可以写成
bool cmp2(int a,int b)
{ return a<b;
}

举例2

还有一种情况
struct node
{ int x,y;
}a[10];
如果们要求a数组按x值的从小到大排序,若x相等,按y的从小到大排,我们写成:
bool cmp3(node a,node b)
{ if(a.x==b.x)
return a.y<b.y;
else return a.x<b.x;
}

结构体

定义

形式1

#include <bits/stdc++.h>
struct student{
	char s[100];
	int y,m,d,xs;
}str[100]//在主函数外定义了100组包含【char s[100]; int y,m,d,xs;】的数据

形式2

#include <bits/stdc++.h>
struct student{
 char s[100];
 int y,m,d,xs;
}//··· ···省略些许行
int main()
{
//省略些许行
student str[100];在主函数内
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值