结构体问题,不难但很乱

小图灵正在为全校同学登记档案,需要你来帮他排序。学校共n个班(不超过20),编号为1到n;每班的学生数量不等,第i个班的学生数
为k(不超过50),每名同学的学号为1到k。排序时,首先考虑生日,出生越早,排序越靠前;生日相同时,按照名字的字典序排序,学
校内没有同名的同学。最后输出排序后每名同学的名字、班级和学号。
输入描述
第一行一个整数n,表示班级数量。接下来若干行,可分为n组,分别描述1号班到n号班的情况。
每班的第一行是整数k,表示该班级有k名同学;接下来k行,每行一个字符串和三个整数,表示该班1号到k号同学的名字(不超过20个字
符)和出生的年份、月份、日期。

这道题目我不理解,大家可以写出代码帮帮我吗,很着急,如果对我有帮助的话我会及时采纳的


typedef struct stu
{
    int cls;
    int id;
    char name[20];
    int y, m, d;
} Stu;

bool cmp(const Stu &p, const Stu &q)
{
    if (p.y == q.y)
    {
        if (p.m == q.m)
        {
            if (p.d == q.d)
                return strcmp(p.name, q.name) < 0;
            else
                return p.d < q.d;
        }
        else
            return p.m < q.m;
    }
    return p.y < q.y;
}

int main()
{
    int n, k, i, j;
    cin >> n;
    vector<Stu> student;

    for (i = 0; i < n; i++)
    {
        cin >> k;
        for (j = 0; j < k; j++)
        {
            Stu stu;
            cin >> stu.name >> stu.y >> stu.m >> stu.d;
            stu.id = j + 1;
            stu.cls = i + 1;
            student.push_back(stu);
        }
    }

    sort(student.begin(), student.end(), cmp);

    cout << endl;
    for (i = 0; i < student.size(); i++)
    {
        cout << student[i].name << " "
             << student[i].cls << " "
             << student[i].id << endl;
    }
    return 0;
}

haha,同道中人呐,一开始我也这么错的,就怎么看都看不出来怎么改,手欠的人儿(是我)给删了