```cpp
bool cmp(birthday x, birthday y)
{
if(x.year != y.year)return x.year < y.year;
if(x.month != y.month)return x.month < y.month;
if(x.day != y.day)return x.day < y.day;
}
```
>(如果有两个同学生日相同,输入靠后的同学先输出)
除此之外,还需要在结构体里加一个输入次序的比较。
by Terrible @ 2022-11-19 18:02:00
```cpp
#include<cstdio>
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
struct birthday
{
string name;
int year, month, day;
int order;
}a[101];
bool cmp(birthday x, birthday y)
{
if(x.year != y.year)return x.year < y.year;//year 的权力最大,一票否决
if(x.month != y.month)return x.month < y.month;//month 其次
if(x.day != y.day)return x.day < y.day;
return x.order > y.order;//比较次序 order 在年月日都相同的时候,写成 > 号表示倒着来
}
//bool 的返回值是true 和 false,如果写成x.year这样的表达,如果不为 0,会被统统转为 true
//struct 的 cmp 函数要求返回两个元素 x 和 y的大小关系,具体地说是 x 是否严格小于< y
//返回 true 就是告诉 sort x 严格小于< y,反之就是 x 大于等于>= y
//比较两个元素时必须是使用严格小的逻辑,不能用<=这样的表达,会出故障
//例如 a==b,以为 a<=b 且 b<=a,但是对于 sort 来说就是 a<b 且 b<a,天理难容!
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> a[i].name >> a[i].year >> a[i].month >> a[i].day , a[i].order = i;
sort(a + 1, a + n + 1, cmp);
//为了不造成某些麻烦 sort 第一个参数最好写成 a+1,不是 a,写成 a 没问题是因为 a[0] 的所有元素都是
//0或者"",在排序中不会被排到后面
//除了使用标记次序 order 的写法,也可以用stable_sort 倒序排序的方法来实现相同生日的输出靠后要求
for(int i = 1; i <= n; i ++)
cout << a[i].name << "\n";
return 0;
}
```
@[FZwangmuem](/user/677581)
by Terrible @ 2022-11-19 18:12:55
```cpp
return x.year < y.year;
```
可以理解为
```cpp
if(x.year<y.year)return true;
else return false;
```
两者的逻辑就此处而言没有本质差距。
by Terrible @ 2022-11-19 18:15:11
@[Terrible](/user/195942) 谢谢
by _Glassy_Sky_ @ 2022-11-20 15:51:51