はじめに
C++でvectorやstring、mapなどのコンテナを扱う際、「コンテナに要素が一つでも含まれているか、それとも空っぽか」を判定したい場面は非常に多くあります。
この判定には、.empty() というメンバ関数を使うのが、最もシンプルで推奨される方法です。.empty() は、コンテナが空であれば true を、一つでも要素があれば false を返します。
この記事では、.empty() の基本的な使い方と、.size() == 0 という判定方法との違いについて解説します。
.empty() を使ったサンプルコード
このコードは、vector を作成し、要素を追加したり削除したりしながら、その都度 .empty() を呼び出して、コンテナが空かどうかを判定します。
完成コード
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<string> shopping_list;
// 1. 作成直後の状態
// まだ何も入っていないので、empty()はtrueを返す
cout << "買い物リストは空ですか? -> " << boolalpha << shopping_list.empty() << endl;
// 2. 要素を追加
shopping_list.push_back("りんご");
cout << "りんごを追加しました。" << endl;
// 要素が一つ入ったので、empty()はfalseを返す
cout << "買い物リストは空ですか? -> " << boolalpha << shopping_list.empty() << endl;
// 3. 要素を削除
shopping_list.pop_back();
cout << "りんごを削除しました。" << endl;
// 再び空になったので、empty()はtrueを返す
cout << "買い物リストは空ですか? -> " << boolalpha << shopping_list.empty() << endl;
return 0;
}
boolalpha: bool値を 1/0 ではなく true/false の文字列として出力させます。
コードの解説と .size() との違い
.empty()
- 機能: コンテナの要素数がゼロかどうかを判定し、
bool値 (true/false) を返します。 - 戻り値:
- コンテナが空の場合 →
true - コンテナに要素が1つ以上ある場合 →
false
- コンテナが空の場合 →
なぜ .size() == 0 ではなく .empty() を使うのか?
コンテナが空かどうかは、if (my_vector.size() == 0) のように、要素数を返す .size() を使っても判定できます。しかし、.empty() を使う方が一般的に推奨されます。その理由は以下の通りです。
- 意図の明確さ:
.empty()という関数名は、「空かどうかを判定したい」というプログラマの意図を直接的に表現します。size() == 0よりも、コードが読みやすくなります。 - パフォーマンス:
std::listのような一部のコンテナでは、.size()の計算量がO(n)(要素数に比例)である可能性があります(C++11以降ではO(1)が保証されました)。一方、.empty()は常に**O(1)(定数時間)**で完了することが保証されています。どのようなコンテナでも、.empty()の方が高速であるか、少なくとも同等です。
結論として、コンテナが空かどうかを判定する目的では、常に .size() == 0 よりも .empty() を使うべきです。
まとめ
今回は、C++のコンテナが空かどうかを判定する .empty() メソッドについて解説しました。
.empty()を使うと、コンテナが空 (true) かどうかを簡単に判定できる。.size() == 0よりも、意図が明確で、かつパフォーマンス上有利なため、.empty()の使用が強く推奨される。
ループ処理の前など、コンテナに要素が存在するかどうかを確認する際には、if (!my_container.empty()) のようなチェックを入れるのが、安全なプログラミングの定石です。
