这道题又一次的戳到了我的盲区;
一定要注意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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。