Как использовать qsort для строки в переполнении стека

Я хочу использовать функцию 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*))'

Было бы здорово, если бы кто-нибудь мог предоставить эффективный способ сделать это.

5

Решение

Я настоятельно рекомендую современный метод

#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 позволяет компилятору оптимизировать лучше, так что это беспроигрышный …

15

Другие решения

Ваш компаратор для qsort ожидает строки C, а не C ++ std::strings. Вы должны либо объявить 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());
4

Если вы действительно хотите это сделать, просто передайте указатель на содержимое строки:

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

Тем не менее, вы действительно должны рассмотреть возможность использования функций, предоставляемых в STL, а не из старой библиотеки C …

0

Вы должны использовать функцию 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
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;
}
0
По вопросам рекламы [email protected]