質問があります:
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;
}
_
.compare()
は、2つの文字列の差の尺度である整数を返します。
0
の戻り値は、2つの文字列が等しいと比較されることを示します。operator==
は、文字列が等しいかどうかを示すブール値を返すだけです。
追加の詳細が不要な場合は、==
を使用することもできます。
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
が引数で指定された文字シーケンスの後に辞書式順序で現れる場合は正の値
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では、単純にするために、通常の小なり比較ベースの辞書式比較は、タプル比較の観点から非常に簡単に実装できます。