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::sortover をqsort使用すると、コンパイラがより適切に最適化できるため、双方にとってメリットがあります...

于 2013-07-20T02:29:53.360 に答える
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());
于 2013-07-20T02:29:34.773 に答える
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() を使用して範囲内に実装できます。最初の 2 つの要素を並べ替えたい場合、コードは次のようになります。

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

上記のコードの場合、出力は次のようになります

//output: acke

したがって、最初のn要素をソートしたい場合は、次のように書くことができます

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

sort 関数を変更することもできます。その場合、2 つではなく 3 つのパラメーターを渡す必要があります。3 番目のパラメーターは、値を返す関数になります。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 に答える