1

C スタイルの配列を使用すべきではないことはわかっていますが、とにかくこれを行う方法を探していました。const char*配列をアルファベット順に並べ替えようとしていますが、std::sortうまくいきませんでした。私は何を間違っていますか?

#include <iostream>
#include <algorithm>

int main() {

   const char * str[5] = {"alpha", "gamma", "beta", "delta", "chi"};

   int size = sizeof(str)/sizeof(*str);

   std::sort(str, str + size);

   for (int i = 0; i < size; i++) std::cout << str[i] << ", ";

}

配列はまったく変更されません。私は何をしていないのですか?

4

3 に答える 3

5

デフォルトのstd::sort比較関数は、単純にポインタ(メモリ アドレス) を<演算子と比較するだけです。実際には、辞書編集的に C 文字列を比較しているわけではありません。たとえば、次のように呼び出して、文字列を辞書順に比較するカスタム比較関数を作成する必要があります。std::strcmp

bool compare(const char* s1, const char* s2)
{
    return std::strcmp(s1, s2) < 0;
}

int main() 
{
   const char * str[5] = {"alpha", "gamma", "beta", "delta", "chi"};
   int size = sizeof(str)/sizeof(*str);
   std::sort(str, str + size, compare);
   for (int i = 0; i < size; i++) std::cout << str[i] << ", ";
}
于 2013-01-03T00:41:50.823 に答える
3

問題は単純です。ポインター値を比較するだけのデフォルトの比較を使用しています。通常、これらのアドレスは昇順であるため、変更は見られません。

独自の比較関数を作成する必要があります。

int comp(const char *c1, const char *c2) {
    return strcmp(c1, c2) < 0;
}

std::sort(str, str + size, &comp);
于 2013-01-03T00:42:52.263 に答える
2

おそらく、デフォルトのコンパレーターconst char *がポインター値を比較しているためです(そして、文字列定数はたまたま配列順に割り当てられています)?

を使用しstd::stringます。

于 2013-01-03T00:42:07.410 に答える