5

我想使用 qsort 函数使用 C++ 对字符串中的字符进行排序。

#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

int compare_str(void const *a,void const *b){
    char const *aa=(char const *)a;
    char const *bb=(char const *)b;

    if(*aa==*bb) return 0;
    else if(*aa>*bb) return 1;
    else return -1;
}
int main(){

    string str="cake";
    int len=str.length();

    qsort(str,len,sizeof(str[0]),compare_str);
    cout<<str;
    return 0;
}

但它抛出:

20 42 [Error] cannot convert 'std::string {aka std::basic_string<char>}' to 'void*' for argument '1' to 'void qsort(void*, size_t, size_t, int (*)(const void*, const void*))' 

如果有人能提供一种有效的方法来做到这一点,那就太好了。

4

5 回答 5

15

我强烈推荐现代方法

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string s("cake");

    std::sort(s.begin(), s.end());

    std::cout << s << std::endl; // Prints "acek".

    return 0;
}

另外,使用std::sortoverqsort可以让编译器更好地优化,所以这是双赢的......

于 2013-07-20T02:29:53.360 回答
4

您的比较器qsort需要 C 字符串,而不是 C++ std::string。你应该要么声明strchar str[]

char str[] = "cake";
qsort(str, strlen(cake), sizeof(char), compare_str); // Consider renaming to compare_char

或(更好)使用std::sort

string str = "cake";
sort(str.begin(), str.end());
于 2013-07-20T02:29:34.773 回答
0

如果你真的想这样做,只需传递一个指向字符串内容的指针:

qsort(str.c_str(),len,sizeof(str[0]),compare_str);

也就是说,你真的应该考虑使用 STL 中提供的函数,而不是旧 C 库中的函数......

于 2013-07-20T02:41:37.497 回答
0

您应该在 header 下使用函数 sort() <algorithm>。此功能非常灵活,您可以以不同的方式使用它。对于您希望的排序,您可以只写:

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

int main()
{
string s="cake";

sort(s.begin(), s.end());

cout << s << endl;

return 0;
}

//output: acek

再次通过使用 sort() 我们可以在一个范围内实现它。如果要对前两个元素进行排序,代码将是

sort(s.begin(), s.begin()+2);

对于上面的代码,输出将是

//output: acke

所以如果我们想对第一个n元素进行排序,那么我们可以写

sort(s.begin,s.begin()+n);

我们还可以修改排序功能。在这种情况下,我们必须传递三个参数而不是两个。第三个参数将是一个返回值的函数。bool例如,如果我们要按降序排序,那么我们的代码将是这样的

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

bool desc(char i, char j)
{
    return i>j;
}

int main()
{
    string s="cake";

    sort(s.begin(), s.end(),desc);

    cout << s << endl;

    return 0;
}

//output: keca
于 2013-07-20T06:49:20.513 回答
0
#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

int compare_str(void const *a,void const *b){
    char const *aa=(char const *)a;
    char const *bb=(char const *)b;

    if(*aa==*bb) return 0;
    else if(*aa>*bb) return 1;
    else return -1;
}
int main(){

    string str="cake";
    int len=str.length();

    qsort(const_cast<char*>(str.c_str()),len,sizeof(str[0]),compare_str);
    cout<<str<<endl;
    return 0;
}
于 2013-07-20T10:04:33.757 回答