C++の文字列比較:== 演算子と compare() の違いとは?
はじめに
C++では、== 演算子と compare() 関数という2つの方法で文字列を比較できます。「なぜ2つの方法が存在するのか?」「何か違いがあるのか?」と疑問に思う方も多いでしょう。
結論から言うと、この2つには明確な役割の違いがあります。それぞれの特徴を詳しく見ていきましょう。
== 演算子の特徴:等しいかどうかの判定
C++では、std::string クラスに対して == 演算子がオーバーロードされています。そのため、2つの文字列が完全に一致しているかどうかを直感的にチェックできます。
- 両者の文字列が一致する場合:
true(出力上は 1)を返す - 一致しない場合:
false(出力上は 0)を返す
つまり、== はいわばブール値(真偽値)を返す比較であり、「等しいか否か」だけを知りたい場面に適しています。
compare() 関数の特徴:大小関係まで判定できる
一方、compare() 関数は単純な真偽ではなく、比較結果を整数値として返します。
- 両者の文字列が等しい場合:0 を返す
- 不一致の文字 s と t が見つかり、s が t より小さい場合:負の値(例:-1)を返す
- s が t より大きい場合:正の値(例:+1)を返す
比較は文字のASCIIコード(辞書順)に基づいて行われるため、ソート処理や辞書順での大小比較が必要な場面で活躍します。なお、実際の戻り値は処理系によって文字コードの差分となることもありますが、「負・ゼロ・正」という符号の意味は共通です。
サンプルコード
それでは、実際のコードで挙動を確認してみましょう。
#include <iostream>
using namespace std;
int main() {
string str1 = "Hello";
string str2 = "Help";
string str3 = "Hello";
cout << "== 演算子で str1 と str2 を比較、結果: " << (str1 == str2) << endl; // 一致しないため 0
cout << "== 演算子で str1 と str3 を比較、結果: " << (str1 == str3) << endl; // 一致するため 1
cout << "compare() で str1 と str2 を比較、結果: " << str1.compare(str2) << endl; // 大小関係を判定
cout << "compare() で str1 と str3 を比較、結果: " << str1.compare(str3) << endl; // 一致するため 0
}実行結果
== 演算子で str1 と str2 を比較、結果: 0 == 演算子で str1 と str3 を比較、結果: 1 compare() で str1 と str2 を比較、結果: -1 compare() で str1 と str3 を比較、結果: 0
結果の解説
"Hello" と "Help" を比較すると、4文字目で初めて不一致が発生します('l' と 'p')。ASCIIコードでは 'l' の方が小さいため、compare() は負の値である -1 を返しています。一方、== は一致するかどうかだけを見るため、単純に 0(偽)を返します。
使い分けのポイント
- 等しいかどうかだけを知りたい → 可読性の高い
==演算子がおすすめ - 辞書順での大小関係(前後関係)を判定したい →
compare()を使用(ソートや条件分岐に便利)
目的に応じて適切な方法を選ぶことで、意図が伝わりやすいクリーンなC++コードを書くことができます。
-
C#におけるStringとStringBuilderの違いを徹底解説
C#における文字列(String)の特徴C#のstring型は不変(イミュータブル)です。つまり、一度生成した文字列は後から変更することができません。文字列に対して何らかの操作を行うと、そのたびにメモリ上に新しいstring型のオブジェクトが生成されます。 string str1 = Welcome!; // 新しい文字列インスタンスが生成される str1 += Hello; str1 += World; 上記のコードのように「+=」演算子で文字列を連結すると、連結のたびに新しい文字列オブジェクトが作成され、元のオブジェクトは不要になります。その結果、大量の文字列連結を繰り返す場合には、パフォ
-
【Java入門】StringとStringBufferの違いを徹底解説!使い分けのポイント
Javaにおける文字列操作では、StringとStringBufferという2つの重要なクラスを使い分ける必要があります。この記事では、それぞれの特徴と違いをわかりやすく解説します。 Stringクラスの特徴 Stringは不変(イミュータブル)なクラスです。一度生成されたオブジェクトは、その後変更することができません。ただし、変数が別のオブジェクトを参照するように再代入することは可能です。 Stringはマルチスレッド環境で特に有用です。複数のスレッドがオブジェクトの状態を変更できないため、不変オブジェクトは本質的にスレッドセーフであると言えます。 StringBufferクラスの特徴 一方