读书人

sort 二维数组排序解决方法

发布时间: 2013-08-24 13:17:55 作者: rapoo

sort 二维数组排序
一个小的测试程序,但是结果却不对。


#include <iostream>
#include <string.h>
#include <cstdlib>
#include <algorithm>
using namespace std;
char *A[4];
int cmp(const char *a, const char *b) {
return strcmp(a, b);
}
int main()
{
A[1] = "hello";
A[2] = "my";
A[3] = "zzz";
A[0] = "world";
sort(A, A+4, cmp);
int i;
for(i=0; i<4; i++) cout << A[i] << endl;
return 0;
}

希望A的4个字符串能按字典序输出。但是结果却不对。 二维数组 sort
[解决办法]
换成这样再试试呢。

return strcmp(a, b)<0;

[解决办法]
引用:
Quote: 引用:

改这样, 以测试 OK

bool cmp(const char *a, const char *b)
{
if( strcmp(a, b) < 0 )
return true;
else
return false;
}

能不能解释下原先的为什么不正确?


前者小的时候,结果负数,但是不为零,结果为真,交换数据
前者大的时候,结果正数,结果还是不为零,为真 ,交换数据

那个函数只是判断结果 是零 还是非零, 你这样写 不管大小, 都是非零的

除非相等

[解决办法]
引用:
Quote: 引用:

int cmp(const char *a, const char *b) {
return strcmp(a, b);
}

改成
bool cmp(const char *a, const char *b) { 


return strcmp(a, b) <= 0;//<=都表示位置正确
}


能不能解释一下原先为什么不正确?


原先的函数类型是int ,而sort要求的比较函数是bool类型的
再看 strcmp(a, b)
a < b 返回 -1
a = b 返回 0
a > b 返回 1
当你直接 return strcmp(a, b) 的时候,只有a = b的时候是0,其他都是非0
而在sort中,如果有比较函数,会用 cmp 和 !cmp来进行位置判断。
在sort中,按照这个标准就把字符串位置换来换去,结果错误。

所以 用return strcmp(a, b) <=0 这样告诉sort 当a <= b的时候,2个字符串的位置正确

读书人网 >C++

热点推荐