2

私はsort()C++の関数を使用して、自分で定義した「ゲーム」タイプのオブジェクトのベクトルを並べ替えています。operator<これを行うために、の代わりに機能し、3番目のパラメーターとして関数に渡される関数を手動で作成していsort()ます。まず、スコアに基づいて比較します。次に、スコアが同点の場合、チーム名に基づいて比較します。

私が必要としているのは関数です。これは、辞書の前にalphabetical(string s1, string s2)ある場合にtrueを返します。例えば:s1s2

alphabetical("aardvark", "apple"); //true
alphabetical("balloon", "zebra"); //true
alphabetical("zebra", "apple"); //false

また、文字列が同一の場合はfalseを返すようにします。ライブラリに使用できるものはありますか?または、関数をどのように記述しますか?はっきりと出会えるといいのですが。

4

3 に答える 3

4

std::string辞書式順序未満の比較演算子自体を実装しstringA < stringBます。これは、通常、必要な処理を実行する必要があることを意味します。を作成するstd::list<std::string> wordsと、アルファベット順の並べ替えは次のように簡単になります。words.sort();

カスタムGameクラスでは、比較未満の演算子を次のように単純に実装できます。

return (score < rhs.score) || (score == rhs.score && team < rhs.team)

辞書式順序付けは、必ずしも人間が期待するものとは限らないことに注意してください。Jeff Atwoodは、この投稿で、いわゆる「自然順順」と辞書式順序の比較について説明します。彼の投稿は、そのようなソートが必要な場合にアルゴリズムを見つけることができるリソースも提供します。

于 2012-09-11T01:18:24.313 に答える
1

文字列がすべて上または下の場合、標準の文字列比較が機能します。EBSIDICなど、もう使用されていない文字エンコードでも機能すると思います。

大文字と小文字が混在する場合は、「A」が「z」より大きいため、これは機能しません。これを機能させるには、stricmpなどを使用する必要があります。basic_stringのchar_traitsをオーバーライドして、感度の低い比較を行うこともできます。

「a」の前に「A」を配置するか、またはその逆で「a」の後に「b」を配置するような並べ替えを記述したい場合は、独自に記述する必要があります。現在ほとんどのオペレーティングシステムで使用されているASCIIテーブルを使用すると、かなり簡単になります。

英語以外の言語をサポートする必要がある場合、問題は実際には重要になります。

于 2012-09-11T01:20:37.687 に答える
-1

を使用している場合は、を使用std::stringできます<。ただし、すでに持っている場合はchar*、それを変更したくない(または変更できない)場合で、に変換するオーバーヘッドを回避したいstd::string場合は、を使用できますstd::lexicographical_compare()

もちろん、どちらの場合も、大文字と小文字を区別しない比較が必要になる可能性があります。オフハンド私は正しい解決策が何であるかstd::string、おそらく何かと関係があるのか​​わかりませんchar_traitsが、lexicographical_compare()あなたのためにコンパレータを提供することができます:

bool alphabetical(const char *str1, const char *str2) {
    return std::lexicographical_compare(str1, &str1[strlen(str1)], str2, &str2[strlen(str2)], [](char a, char b){
        return tolower(a) < tolower(b);
    });
}
于 2012-09-11T01:19:10.213 に答える