这个的输出,为什么第二行是7,3?
struct {
int a; int *b;
} s[4], *p;
int i, n = 1;
for(i = 0; i < 4; i++){
s[i].a = n;
s[i].b = &s[i].a;
n = n + 2;
}
p = &s[0];
printf("%d\n", ++*p->b);
p++;
printf("%d,%d\n", (++p)->a, (p++)->a); /* 输出数据之间没有空格分隔;按从右向左的顺序求解表达式 */
函数的参数求值顺序,是C语言的未定义行为,各个编译器输出的结果都不一定
注意,我选不同的编译器,它结果都不一样。
俗话说工欲善其事必先利其器,知道了sort的原理,我们就可以进行排序了,当然也可以自己设计排序规则,而且结构体可以直接进行赋值,也很方便。
如果想通过sort进行排序,那么就需要知道如何设计排序规则,假设我们有三个变量来描述一个学生,如果名字一样,就通过年龄排序,如果年龄也相同,就通过成绩来排序,默认的顺序都是从小到大的顺序进行排序。
于是首先设计结构体student:
struct student{
string name; //姓名
int age; //年龄
int grade; //成绩
};
第二个问题,也是难点,设计排序规则,那么就需要了解sort的实现原理。在自己的设计规则中,引用的两个串不希望改变它们的值所以设计为const引用,然后考虑具体的规则:默认排序是按照从小到大的顺序进行排序,所以如果两个对象的name不相等,那么就返回s1.name < s2.name ,这是对于name 不相等的情况,对于name相等,我们还需要考虑age相不相等,如果不考虑,默认是按照数组中的原本顺序排列的,不会做排序处理。
int comp(const student &s1,const student &s2){
if(s1.name == s2.name && s1.age != s2.age){
return s1.age < s2.age;
}
else if(s1.name == s2.name && s1.age == s2.age){
return s1.grade < s2.grade;
}
else{
return s1.name < s2.name;
}
}
测试代码:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
//按姓名从小到大排序,姓名一样,按年龄从小到大排序
struct student{
string name; //姓名
int age; //年龄
int grade; //成绩
};
//自己定义的排序规则
int comp(const student &s1,const student &s2){
if(s1.name == s2.name && s1.age != s2.age){
return s1.age < s2.age;
}
else if(s1.name == s2.name && s1.age == s2.age){
return s1.grade < s2.grade;
}
else{
return s1.name < s2.name;
}
}
int main(){
student s[100];
s[0].name = "zhangsan"; s[0].age = 19; s[0].grade = 20;
s[1].name = "zhangsan"; s[1].age = 18; s[1].grade = 20;
s[2].name = "lisi"; s[2].age = 20; s[2].grade = 20;
s[3].name = "zhangsan"; s[3].age = 19; s[3].grade = 2;
s[4].name = "zhangsan"; s[4].age = 17; s[4].grade = 20;
s[5].name = "lisi"; s[5].age = 20; s[5].grade = 15;
sort(s, s + 6, comp); //左闭右开,所以是对s[0]到s[6]排序
for(int i = 0; i < 6; i++){
cout<<s[i].name<<" "<<s[i].age<<" "<<s[i].grade<<endl;
}
return 0;
}