web-dev-qa-db-ja.com

文字列の比較、C ++

質問があります:

2つの_std::string_ sがあり、それらを比較したいとします。stringクラスのcompare()関数を使用するオプションがありますが、単純な_< > !=_演算子(_<string>_ライブラリを含めなくても両方のケースが可能です)。単純な演算子を使用して比較できる場合、誰かがcompare()関数が存在する理由を説明できますか?

ところで、私はCode :: Blocks 13.12を使用しています。これが私のコードの例です。

_#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;

int main()
{
    string temp1, temp2;
    cout << "Enter first Word: ";
    getline (cin,temp1);
    cout << "Enter second Word: ";
    getline (cin,temp2);
    cout << "First Word: " << temp1 << endl << "Second Word: " << temp2 << endl;
    if (temp1 > temp2)
    {
        cout << "One" << endl;
    }
    if (temp1.compare(temp2) < 0)
    {
        cout << "Two" << endl;
    }
    return 0;
}    
_
16
Medvednic

.compare()は、2つの文字列の差の尺度である整数を返します。

  • 0の戻り値は、2つの文字列が等しいと比較されることを示します。
  • 正の値は、比較される文字列が長いか、最初の一致しない文字が大きいことを意味します。
  • 負の値は、比較される文字列が短いか、最初の一致しない文字が小さいことを意味します。

operator==は、文字列が等しいかどうかを示すブール値を返すだけです。

追加の詳細が不要な場合は、==を使用することもできます。

31
Tom Fenech
string cat = "cat";
string human = "human";

cout << cat.compare(human) << endl; 

このコードは結果として-1を返します。これは、比較文字列「human」が「cat」より長い場合でも、比較文字列「h」の最初の不一致文字が「c」の後にアルファベット順で低いか、または出現するためです。

cplusplus.com で説明されている戻り値がより正確であることがわかりました。

0:それらは等しいと比較します

<0:一致しない最初の文字の値が比較文字列で低いか、すべての比較文字が一致するが比較文字列が短い。

0より大きい:比較された文字列で、一致しない最初の文字の値が大きいか、比較されたすべての文字が一致するが、比較された文字列が長い。

さらに、IMO cppreference.com の説明はより単純で、これまでのところ、私自身の経験を最もよく説明しています。

*thisが引数で指定された文字シーケンスの前に辞書編集順に現れる場合は負の値

両方の文字シーケンスが同等の場合、ゼロ

*thisが引数で指定された文字シーケンスの後に辞書式順序で現れる場合は正の値

4
Idz

questionに関しては、

単純なオペランドを使用して比較できる場合に、compare()関数が存在する理由を誰かが説明できますか?

<および==に比べて、compare関数は概念的にシンプルであり、実際には通常の順序でアイテムごとに2つの比較を避けるため、より効率的ですcanアイテムの。


単純化の例として、小さな整数値の場合、次のような比較関数を作成できます。

auto compare( int a, int b ) -> int { return a - b; }

これは非常に効率的です。

今構造のために

struct Foo
{
    int a;
    int b;
    int c;
};

auto compare( Foo const& x, Foo const& y )
    -> int
{
    if( int const r = compare( x.a, y.a ) ) { return r; }
    if( int const r = compare( x.b, y.b ) ) { return r; }
    return compare( x.c, y.c );
}

この辞書式比較を<の観点から直接表現しようとすると、恐ろしく複雑で非効率的になります。


C++ 11では、単純にするために、通常の小なり比較ベースの辞書式比較は、タプル比較の観点から非常に簡単に実装できます。