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
最初の 0 は s1 == s2 の結果(false)です。s1.compare(s2) は最初に異なる文字('T' と 'H')の差である正の値を、s2.compare(s1) はその逆の負の値を返します。なお、正負の具体的な数値は処理系によって異なる場合がありますが、符号を見れば大小関係が分かるという点は共通しています。
まとめ:使い分けのポイント
| 項目 | 比較演算子(==) | compare() |
|---|---|---|
| 戻り値の型 | bool | int |
| 得られる情報 | 等しいかどうかのみ | 等しさに加えて大小関係 |
| 主な用途 | 一致判定 | ソート・辞書順比較 |
| 内部実装 | compare() を利用 | ― |
「等しいかどうかの判定」には ==、「どちらが大きいかまで知りたい場合」には compare() を使う、と覚えておくと分かりやすいでしょう。
-
C++におけるドット演算子(.)とアロー演算子(->)の違いを徹底解説
C++では、ドット演算子(.)とアロー演算子(->)はどちらもクラスのメンバーにアクセスするために使用されますが、それぞれ使用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」とみなされるため、以下の説明はこれら3つすべてに当てはまります。基本的な使い分けa.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は常にクラスの実際のオブジェクト(またはその参照)でなければなりません。a->b は、本質的に (*a).b の省略記法で
-
「!==」と「==!」の違いを解説!PHPの比較演算子
PHPには一見よく似ていますが、動作がまったく異なる演算子が存在します。その代表格が「!==」と「==!」です。この記事では、それぞれの演算子の意味と違いを、サンプルコード付きでわかりやすく解説します。 「!==」比較演算子とは 「!==」は「型も含めて等しくない」ことを判定する比較演算子です。値の比較時にデータ型の自動変換(型ジャグリング)を行わず、厳密な型チェックを実施します。そのため、たとえば 1 !== 1 は数値の1と文字列の1というように型が異なるため、true を返します。 「==!」比較演算子とは 実は「==!」という単一の演算子は存在しません。「==!」は「==」と「!」