1

以下の関数は私の比較関数です。2 つの文字を直接比較すると配列が正常に並べ替えられますが、std::string 比較関数を使用するとうまくいきません。

int compare (student a, student b) {
  return a.name.compare(b.name);
  return a.name[0] < b.name[0];
}

呼び出し

sort(data.begin(), data.end(), compare);

データが次のように定義されている場合vector <student> data;

std::compare がソートしないのはなぜですか?

PS: std::compare は位置を反転させます。たとえば、alan、richard、byron、sarah -> sarah、byron、richard、alan などです。

4

4 に答える 4

6

std::string::compareは、実際のソート順を与えるためintに比較することを意図した を返します。0たとえば、が( で指定された順序に従ってa.name) より小さいかどうかを確認するには、次のように記述します。b.namecompare

return a.name.compare(b.name) < 0;

あなたが現在書いている方法は、 std::sortに必要なように、有効な厳密な弱い順序付けtrueではない、等しくない文字列に対して返されます。

std::stringにはoperator<があり、2 つの文字列の順序を同等にするため、compareここで使用する正当な理由はまったくありません。

return a.name < b.name;
于 2013-03-12T22:18:31.940 に答える
2

cppreference.com で std::sort リファレンスを読んでください。bool比較関数は、最初の引数が 2 番目の引数より小さいことを示すa を返す必要があることを明確に説明しています。

この場合、次のように呼び出します。

std::sort(data.begin(), data.end(), [](student const& a, student const& b) {
    return a.name < b.name;
})

では、コードで何が起こっているのでしょうか? names が等しい場合、compareにキャストされる 0 を返しますfalse。それ以外の場合は、にキャストされるゼロ以外の整数を取得しますtrue。の並べ替えアルゴリズムはstd::sort絶対に指定されていないため、特定の順序が正確に得られる理由を説明することはできませんが、基本的にstd::sortは、std::swapオブジェクト (疑似) をランダムに処理しています。

compareでは、関数を定義する必要がありますか? 私見、いいえ。いくつかの基本的な型を定義するのは非常に簡単ですが、私が知る限り、実際にはどのアルゴリズムにも現れません。これは C 主義であり、残念ながら C++ はそれを維持しました。必要に応じて、代わりに厳密な弱い順序付けを定義operator<するか、必要に応じてコンパレータを定義します。

于 2013-03-12T22:22:48.083 に答える
1

sortは、コンパレータがoperator <のように動作することを期待していますが、std :: string::compareはここで説明されているように動作します。

于 2013-03-12T22:19:26.870 に答える
1

「同じ」または「同じではない」と見なされるを返してintいます。std::sortこれを返す必要があります:

return a.name.compare(b.name) < 0;

戻り値の型を次のように変更しますbool

ただし、代わりにこれを検討しましたか:

class student
{
public:
   ... members ...

   bool operator <(const student& s) const
   {
       return name < s.name;
   }

private:
   std::string name;
};

そして、作成しようとしているカスタム コンパレータを完全に削除します。std::sort(students.begin(), students.end())これにより、並べ替え中に比較を行うときにデフォルトのコンパレータでstd::less<YourType>ある が演算子を呼び出すため、だけを使用して学生のコレクションを並べ替えることができます。

于 2013-03-12T22:21:34.063 に答える