C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の比較演算子(==)とstd::string::compare()の違いを徹底解説

C++の比較演算子(==)とstd::string::compare()の違いとは?

C++で文字列を比較する方法として、比較演算子 ==std::string::compare() の2つがあります。結論から言うと、この2つの違いは戻り値だけです。実際、string::operator==() は内部的に string::compare() を呼び出して実装されています。

戻り値の違い

比較演算子(==)は、2つの文字列が等しいかどうかを示す bool 型の値(true / false)を返します。一方、compare() は、2つの文字列が互いにどのような関係にあるかを示す int 型の値を返します。

compare() の戻り値は、次のように解釈できます。

  • 0:2つの文字列は等しい
  • 正の値:呼び出し元の文字列の方が辞書順で大きい
  • 負の値:引数に渡した文字列の方が辞書順で大きい

compare()が役立つケース

2つの文字列が異なっていた場合に、「どちらが前(小さい)でどちらが後ろ(大きい)か」という大小関係まで知りたいときは、compare() が便利です。例えば、文字列のソート処理や辞書順の並べ替えを実装する際などに活用できます。単に「等しいかどうか」だけを判定したいのであれば、シンプルに書ける == を使うのが適切です。

コード例

#include <iostream>
using namespace std;

int main() {
    string s1 = "Tutorials Point";
    string s2 = "Hello World";

    // 比較演算子(==):bool値を返す
    cout << (s1 == s2) << endl;

    // compare():整数値を返す
    cout << s1.compare(s2) << endl;
    cout << s2.compare(s1) << endl;

    return 0;
}

出力結果

0
12
-12

最初の 0s1 == s2 の結果(false)です。s1.compare(s2) は最初に異なる文字('T' と 'H')の差である正の値を、s2.compare(s1) はその逆の負の値を返します。なお、正負の具体的な数値は処理系によって異なる場合がありますが、符号を見れば大小関係が分かるという点は共通しています。

まとめ:使い分けのポイント

項目比較演算子(==)compare()
戻り値の型boolint
得られる情報等しいかどうかのみ等しさに加えて大小関係
主な用途一致判定ソート・辞書順比較
内部実装compare() を利用

「等しいかどうかの判定」には ==、「どちらが大きいかまで知りたい場合」には compare() を使う、と覚えておくと分かりやすいでしょう。

  1. C++におけるドット演算子(.)とアロー演算子(->)の違いを徹底解説

    C++では、ドット演算子(.)とアロー演算子(->)はどちらもクラスのメンバーにアクセスするために使用されますが、それぞれ使用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」とみなされるため、以下の説明はこれら3つすべてに当てはまります。基本的な使い分けa.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は常にクラスの実際のオブジェクト(またはその参照)でなければなりません。a->b は、本質的に (*a).b の省略記法で

  2. 「!==」と「==!」の違いを解説!PHPの比較演算子

    PHPには一見よく似ていますが、動作がまったく異なる演算子が存在します。その代表格が「!==」と「==!」です。この記事では、それぞれの演算子の意味と違いを、サンプルコード付きでわかりやすく解説します。 「!==」比較演算子とは 「!==」は「型も含めて等しくない」ことを判定する比較演算子です。値の比較時にデータ型の自動変換(型ジャグリング)を行わず、厳密な型チェックを実施します。そのため、たとえば 1 !== 1 は数値の1と文字列の1というように型が異なるため、true を返します。 「==!」比較演算子とは 実は「==!」という単一の演算子は存在しません。「==!」は「==」と「!」