【C++学習|初心者向け】C++初心者必見!コンテナの空判定は「size() == 0」より「empty()」を使うべき理由

1. 導入:なぜempty()を使うべきなのか?

C++でstd::vectorやstd::listなどのコンテナを扱う際、「このコンテナの中身は空かな?」と確認したい場面は非常に多いです。その際、初心者のうちはつい「if (v.size() == 0)」と書いてしまいがちです。しかし、C++では「if (v.empty())」と書くことが強く推奨されています。なぜなら、単にコードが読みやすくなるだけでなく、パフォーマンスや安全性の観点から「empty()」を使う方がスマートで確実だからです。

2. 基礎知識:コンテナと判定メソッド

C++の標準ライブラリ(STL)にあるコンテナには、格納されている要素数を取得する「size()」と、中身が空かどうかを判定する「empty()」というメソッドが用意されています。

size() は、コンテナ内の要素の数を返すメソッドです。
empty() は、コンテナが空であれば「true」、そうでなければ「false」を返す真偽値判定用のメソッドです。

一見すると「size() == 0」と「empty()」は同じことをしているように思えますが、実は大きな違いがあります。

3. 実装/解決策:なぜempty()が優れているのか

最大の理由は「意図の明確化」と「計算量の保証」です。

第一に、可読性です。「sizeが0であること」を確認するよりも、「空であること(empty)」を確認する方が、プログラムを書いた人の意図が直感的に伝わります。

第二に、計算量の保証です。ごく稀ですが、コンテナの種類によってはsize()を計算するのに時間がかかる実装が存在します(例えば、一部のリスト構造で要素を数え上げる必要がある場合など)。一方、empty()は「最初の要素が存在するかどうか」を確認するだけで済むため、どのようなコンテナであっても、常に非常に高速(定数時間)で動作することが保証されています。

4. サンプルプログラム

以下のコードをコピーして、実際に動作を確認してみてください。

include
include

int main() {
// 空のベクターを作成
std::vector numbers;

// 推奨される書き方:empty()を使用する
if (numbers.empty()) {
std::cout << "コンテナは空です。" << std::endl; } // 要素を追加 numbers.push_back(10); // 再び判定 if (!numbers.empty()) { std::cout << "コンテナには要素が含まれています。" << std::endl; std::cout << "要素数: " << numbers.size() << std::endl; } return 0; }

5. 応用・注意点

現場で役立つ補足として、「bool型への暗黙的な変換」についても触れておきます。
実は、コンテナはそれ自体をif文に直接入れることも可能です。

if (numbers) { / 中身がある場合の処理 / }

これは「!numbers.empty()」と同じ意味になります。しかし、初心者の方には「empty()」を使った方が、何を確認しているのかが明示的になるため、まずは「if (v.empty())」の習慣を身につけることを強くおすすめします。

また、size()が不要な場面で「size() == 0」と書いていると、コードレビューで「ここはempty()を使った方が良いよ」と指摘される可能性が高いです。今のうちから、コンテナの判定は「empty()」とセットで覚えるようにしましょう!

コメント

タイトルとURLをコピーしました