C++-C++排序中的sort函数第三个参数的疑问
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxsize = 1000;
struct stu{
char name[100];
int age;
int score;
};
bool cmp(stu a,stu b)
{
if(a.score < b.score)
return true;
int temp = strcmp(a.name,b.name);
if(temp < 0)
return true;
if(a.age < b.age)
return true;
return false;
}
int main()
{
int n;
struct stu s[maxsize];
while(scanf("%d",&n) != EOF)
{
for(int i = 0;i < n;++i)
{
scanf("%s",&s[i].name);
scanf("%d",&s[i].age);
scanf("%d",&s[i].score);
}
sort(s,s+n,cmp);
for(int i = 0;i < n;++i)
{
printf("%s ",s[i].name);
printf("%d ",s[i].age);
printf("%d",s[i].score);
printf("n");
}
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
sort的第三参数 是确定按那种顺序排序用的。只返回 ture或fault 中的某一个值 不能使电脑明白 是按怎样的顺序排。而 a.score < b.score 则可以让电脑明白 是按 a.score 比 b.score 小的顺序排列。
首先申明我是java系的, 对c嘎嘎不是很懂, 但是你的问题应该是在逻辑上的.
http://www.cplusplus.com/reference/algorithm/sort/
comp
Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines.
comp返回true, 表示第一个参数应该放在第二个参数前面, 对吧?
那你看这个:
a
score 100
name abc
age 19
b
score 100
name bac
age 20
算算cmp(a, b),
strcmp(a.name,b.name) < 0
cmp(a, b)返回true;
再算算cmp(b, a),
strcmp(b.name,a.name) > 0
a.age < b.age
cmp(b, a) = true;
更新: 看了下资料, 这里cmp类比于 小于号, 即cmp(a, b)=true 类比于 a<b; cmp(b, a) = true 于b<a. 所以是不对的.
看到了吧, a既可以放在b的前面, 也可以放在后面, 那a=b了? 但是这里要满足strict weak ordering:
https://www.sgi.com/tech/stl/StrictWeakOrdering.html
Two objects x and y are equivalent if both f(x, y) and f(y, x) are false
所以不满足strict weak ordering了?
手头没有C嘎嘎环境, 请试试是否是这个问题, 多谢.
更新
改为:
bool cmp(stu a,stu b)
{
if(a.score < b.score)
return true;
else if(a.score > b.score)
return false;
int temp = strcmp(a.name,b.name);
if(temp < 0)
return true;
else if(temp > 0)
return false;
if(a.age < b.age)
return true;
return false;
}