2013-07-20 18 views
5

Desidero utilizzare la funzione qsort per ordinare i caratteri nelle stringhe utilizzando C++.Come utilizzare qsort per string in 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; 
} 

Ma tiri:

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*))' 

Sarebbe bello se qualcuno potesse fornire un modo efficace per farlo.

+6

Sai 'std :: sort' esiste destra ? – Rapptz

+0

'std :: sort' usa algoritmi come un mergesort o quicksort, che sono inefficienti per ordinare sequenze come una' stringa'. Considera alternative come 'radix sort', che sono asintoticamente ottimali nel caso generale. – akappa

risposta

15

vi consiglio vivamente il metodo moderno di

#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; 
} 

Inoltre, utilizzando std::sort sopra qsort permette il compilatore per ottimizzare al meglio, quindi è un win-win ...

4

Il comparatore per qsort prevede C string, non C++ std::string s. Si dovrebbe o dichiarare str essere char str[]

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

o (meglio) utilizzare std::sort:

string str = "cake"; 
sort(str.begin(), str.end()); 
+0

L'esempio con 'vector str' ordinerà le stringhe nel vettore, non i singoli caratteri nelle stringhe, corretto? Non è chiaro se stia semplicemente ordinando una stringa o più ... –

+0

@RyanMcK Ah, hai ragione, sembra che l'OP voglia ordinare i singoli personaggi! – dasblinkenlight

+0

@dasblinkenlight - Come sapete 'sizeof (char)' è uno per definizione. Inoltre, il numero di caratteri in 'str' non è 3. Meglio scrivere la tua chiamata a' qsort' come 'qsort (str, strlen (str), 1, compare_char)' YMMV. –

0

Se si vuole veramente fare questo, basta passare un puntatore a contenuto della stringa:

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

Detto questo, si dovrebbe davvero prendere in considerazione l'utilizzo delle funzioni previste nel STL piuttosto che quelli della vecchia libreria C. ..

+0

s/STL/Libreria standard/ – Johnsyweb

+0

Se avete intenzione di percorrere quella strada, probabilmente meglio usare str.c_str(). Ma come molti altri hanno detto, std :: sort è la scelta migliore. – Joel

+0

Non importa, asker voleva ordinare la stringa sul posto. Errore mio. Tuttavia, is & str [0] è garantito per funzionare? – Joel

0

È necessario utilizzare la funzione sort() sotto l'intestazione <algorithm>. Questa funzione è molto flessibile e puoi usarla in modi diversi. Per ordinare in base alle tue esigenze puoi semplicemente scrivere:

#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 

di nuovo usando sort() possiamo implementarlo in un intervallo. Se si desidera ordinare primi due elementi, il codice sarà

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

per codice sopra l'uscita sarà

//output: acke 

quindi se vogliamo ordinare primo elemento n allora possiamo scrivere

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

possiamo anche modificare la funzione di ordinamento. In tal caso dobbiamo passare tre parametri anziché due. Il terzo parametro sarà un funzioni che restituisce un esempio bool value.For, se vogliamo ordinare in ordine decrescente, allora il nostro codice sarà così

#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; 
}