结构体有问题吗?

P1104 生日

```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


|