我想使用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*))'
如果有人能提供一种有效的方法,那就太好了。
答案 0 :(得分: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::sort
而不是qsort
可以让编译器更好地优化,所以这是双赢的...
答案 1 :(得分:4)
qsort
的比较器需要C字符串,而不是C ++ std::string
。您应该将str
声明为char 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());
答案 2 :(得分:0)
如果你真的想这样做,只需传递指向字符串内容的指针:
qsort(str.c_str(),len,sizeof(str[0]),compare_str);
那就是说,你真的应该考虑使用STL中提供的功能而不是旧C库提供的功能......
答案 3 :(得分:0)
您应该使用标题<algorithm>
下的函数sort()。此功能非常灵活,您可以以不同的方式使用它。如您所希望的那样进行排序,您只需写下:
#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);
我们也可以修改sort函数。在这种情况下,我们必须传递三个参数而不是两个。第三个参数是一个返回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
答案 4 :(得分: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;
}