sort 二维数组排序

qdlgdx_lsy 2013-08-17 10:56:57
一个小的测试程序,但是结果却不对。

#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个字符串能按字典序输出。但是结果却不对。
...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
team79 2013-08-17
  • 打赏
  • 举报
回复
楼上+1。。。
ri_aje 2013-08-17
  • 打赏
  • 举报
回复
换成这样再试试呢。

return strcmp(a, b)<0;
大尾巴猫 2013-08-17
  • 打赏
  • 举报
回复
引用 6 楼 qdlgdx_lsy 的回复:
[quote=引用 5 楼 ananluowei 的回复:]
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;//<=都表示位置正确
}
能不能解释一下原先为什么不正确?[/quote] 原先的函数类型是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个字符串的位置正确
max_min_ 2013-08-17
  • 打赏
  • 举报
回复
引用 8 楼 qdlgdx_lsy 的回复:
[quote=引用 4 楼 max_min_ 的回复:] 改这样, 以测试 OK

bool cmp(const char *a, const char *b)
{
     if( strcmp(a, b) < 0 ) 
         return true;
     else 
         return false;
}
能不能解释下原先的为什么不正确?[/quote] 前者小的时候,结果负数,但是不为零,结果为真,交换数据 前者大的时候,结果正数,结果还是不为零,为真 ,交换数据 那个函数只是判断结果 是零 还是非零, 你这样写 不管大小, 都是非零的 除非相等
qdlgdx_lsy 2013-08-17
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
改这样, 以测试 OK

bool cmp(const char *a, const char *b)
{
     if( strcmp(a, b) < 0 ) 
         return true;
     else 
         return false;
}
能不能解释下原先的为什么不正确?
qdlgdx_lsy 2013-08-17
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
换成这样再试试呢。

return strcmp(a, b)<0;
能不能解释一下原先的为什么不正确?
qdlgdx_lsy 2013-08-17
  • 打赏
  • 举报
回复
引用 5 楼 ananluowei 的回复:
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;//<=都表示位置正确
}
能不能解释一下原先为什么不正确?
大尾巴猫 2013-08-17
  • 打赏
  • 举报
回复
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;//<=都表示位置正确
}
max_min_ 2013-08-17
  • 打赏
  • 举报
回复
改这样, 以测试 OK

bool cmp(const char *a, const char *b)
{
     if( strcmp(a, b) < 0 ) 
         return true;
     else 
         return false;
}
qdlgdx_lsy 2013-08-17
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
换成这样再试试呢。

return strcmp(a, b)<0;
只接受0和非零值。-1和1均是非零值,所以排序结果错误。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧