はじめに
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())
のようなチェックを入れるのが、安全なプログラミングの定石です。