C++用sort写的 二维字符数组排序问题

下面这个程序哪里有错,找了好久啊,找不到
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>

using namespace std;

bool cmp(char* str1,char *str2);

int main()
{
char str1[10][10];
int t;
while(1)
{
scanf("%d",&t);
if(t==0)
break;

int i;
for(i=0;i<t;i++)
scanf("%s",str1[i]);

char * str2[10];
for(i=0;i<t;i++)
str2[i]=str1[i];

sort(&str2[0],&str2[0]+t,cmp);

for(i=0;i<t;i++)
{
printf("%s\n",str1[i]);
}
}
return 0;
}

bool cmp(char* str1,char *str2)
{
return (strcmp(str1,str2)>0);
}
/*
可用测试数据
5
a
b
c
a
b
检验后发现,没有排序,这是为什么?
*/

你是对指针数组(即str2)进行排序,最后得到排序后的索引序列,原字符串并没有被改变。所以,最后不应打印str1,而要打印str2:

for(i=0;i<t;i++)
    printf("%s\n", str2[i]);

追问

sort(&str2[0],&str2[0]+t,cmp);

bool cmp(char* str1,char *str2)
{
return (strcmp(str1,str2)<0);
}

平时很少用指针,请问,这个参数是怎么传递过去的,是这样吗 char* str1=&str2[0]?
str2[0]本来就是 char *,这样传递的话不就是char ** to char *,不可能成功啊

追答

这样你需要理解sort的工作原理了:sort的三个参数分别是首地址、尾地址和一个比较器。

排序算法需要比较元素的大小,这个比较器就是告诉sort如何比较两个元素的大小。比如,如果sort是用的冒泡算法的话,它会这样实现:

// Peseudo code
define sort( first, last, prep){
    for e = first to last
        for f = e to last
            if prep(e, f)    // 第三个参数用在这里,prep的参数类型与first、last类型一致。在你的调用中都是char *
                swap(e, f)
}

 你的调用写成这样也可以:

sort(str2, str2+t, cmp);

这个比较器可以是函数指针,也可以是函数对象或lambda表达式(C++11)。

// function handler
bool cmp(char *s, char *t){
    return strcmp(s, t) > 0;
}
sort(str2, str2+t, cmp);

// function object
struct{
    bool operator()(char *s, char *t){
        return strcmp(s, t) > 0;
    }
}cmp;
sort(str2, str2+t, cmp);

// Lambda expression
sort(str2, str2+t, [](char *s, char *t){return strcmp(s, t) > 0;});

追问

看了很久,终于都想明白了,在这儿做点笔记,以后还可以回来看,谢谢哈!
sort(first,last,cmp)前两个参数都为地址,传递到cmp的不是first~last这些地址,而是这些地址所指的内容 ,如 sort(str2, str2+t, cmp);传递到的cmp是str2所指的内容,即str1的地址,strcm(a,b)中,a,b可为字符串,字符数组,也可以是字符串的首地址

温馨提示:答案为网友推荐,仅供参考
相似回答