2013-07-20 10 views
5

qsort関数を使用して、C++を使用して文字列の文字を並べ替える必要があります。C++で文字列にqsortを使用する方法

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

誰もがこれを行うための効率的な方法を提供することができればそれは素晴らしいことです。

+6

ようになり、bool value.For例を返す関数になります? – Rapptz

+0

'std :: sort'はmergesortやquicksortのようなアルゴリズムを使います。これは' string'のようなシーケンスをソートするのには効率が悪いです。一般的な場合に漸近的に最適な 'radix sort'のような代替案を考えてみましょう。 – akappa

答えて

15

私は強くstd::sortことができますqsort上を使用して、

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

プラスの近代的な方法をお勧めしますコンパイラはより良い最適化するので、それはwin-winです...

4

qsortのコンパレータでは、C++ std::stringではなくC文字列が必要です。あなたはchar str[]

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

または(より良い)std::sortを使用するstrを宣言する必要があり、次のいずれか

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

'ベクトル str'のあなたの例は、文字列の個々の文字ではなく、ベクトルの文字列をソートしますか?彼がちょうど1つの文字列をソートしているのか、それとも多くをソートしているのかは少し不明です... –

+0

@ RyanMcKああ、そうです、OPが個々のキャラクターをソートしたいようですね! – dasblinkenlight

+0

@dasblinkenlight - あなたが知っているように、 'sizeof(char)'は定義上のものです。さらに、 'str'の文字数は3ではありません。' qsort'への呼び出しを 'qsort(str、strlen(str)、1、compare_char)' YMMVとして書く方が良いでしょう。 –

0

あなたが本当にこれをしたい場合は、単に文字列の内容へのポインタを渡します

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

あなたが本当にかなり古いCライブラリからのものよりも、STLで提供される機能を利用して検討すべき、と述べました。 ..

+0

s/STL/Standard Library/ – Johnsyweb

+0

もしあなたがそのルートに行くなら、おそらくはstr.c_str()を使うのが良いでしょう。しかし、多くの人が言っているように、std :: sortは最良の選択です。 – Joel

+0

心配しないで、Askerは文字列を所定の場所に並べ替えたいと思っていました。私の間違い。それにもかかわらず、&str [0]は動作することが保証されていますか? – Joel

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 

を再び我々は範囲でそれを実装することができます()ソートすることもできます。あなたが最初の二つの要素をソートしたい場合は、コードが出力は、我々が最初にn要素をソートしたいならば、我々は

を書くことができます

//output: acke 

そうになり、上記のコードのための

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

になります

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

ソート機能を変更することもできます。その場合、2つではなく3つのパラメータを渡す必要があります。三番目のパラメータは、私たちが降順にソートする場合は、次に我々のコードは、あなたが `のstd :: sort`は、右の存在を知っているこの

#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; 
} 
関連する問題