这道题又一次的戳到了我的盲区;一定要注意sort和cmp的返回值;其实可以这么理解;对于cmp,我们的目的是让数据按照给出的形式进行排序,例如我们想让序列递增,则排序的方式就为:a<b;这样序列中处处都是a<b;同理,如果构建了struct,其中包括一个string,我们希望整个序列按照字典序递增,该怎么办?这个时候就要用到strcmp函数来做辅助;默认情况下strcmp(a,b),当a的字典序大于b的时候,返回的就是1,等于为0,小于返回-1;所以如果a>b,则strcamp(a,b)>0但是我们希望的是递增,也就是a<b,所以对应的情况就是strcamp(a,b)返回-1,所以这个时候应该返回的判定条件就是strcmp(a,b)<0,也就是符合字典序a<b的那种情况;#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string>#include<cstring>#include<vector>#include<algorithm>using namespace std;using std::vector;const int maxn=100010;struct node{ int id; char name[9]; int grade;}mem[maxn];bool cmp1(node a,node b){ return a.id<b.id;}bool cmp2(node a,node b){ if(strcmp(a.name,b.name)==0) return a.id<b.id; else return strcmp(a.name,b.name)<0;}bool cmp3(node a,node b){ if(a.grade==b.grade) return a.id<b.id; else return a.grade<b.grade;}int main(){ int n,c; scanf("%d%d",&n,&c); for(int i=0;i<n;i++){ scanf("%d %s %d",&mem[i].id,&mem[i].name,&mem[i].grade); } if(c==1){ sort(mem,mem+n,cmp1); }else if(c==2){ sort(mem,mem+n,cmp2); }else{ sort(mem,mem+n,cmp3); } for(int i=0;i<n;i++){ printf("%06d %s %d\n",mem[i].id,mem[i].name,mem[i].grade); } system(“pause”); return 0;}