C++-C++排序中的sort函数第三个参数的疑问

发布于 2017-05-25 05:08:26 字数 1115 浏览 1325 评论 2

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虐人心 2017-08-06 04:38:46

sort的第三参数 是确定按那种顺序排序用的。只返回 ture或fault 中的某一个值 不能使电脑明白 是按怎样的顺序排。而 a.score < b.score 则可以让电脑明白 是按 a.score 比 b.score 小的顺序排列。

清晨说ぺ晚安 2017-07-11 14:18:49

首先申明我是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;
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文