【C++】vector等のコンテナを空にする.clear()の使い方

目次

はじめに

C++でvectorlistmapなどのコンテナを再利用する際、「コンテナの中身を全て削除して、空の状態に戻したい」という場面は頻繁にあります。

forループで末尾の要素を一つずつ.pop_back()で削除していく方法もありますが、よりシンプルで効率的な方法が、.clear() メンバ関数です。.clear()は、コンテナが持つ全ての要素を一度の操作で解放(破棄)します。

この記事では、.clear()の基本的な使い方と、その際のメモリ(キャパシティ)の挙動についての注意点を解説します。


.clear() を使ったサンプルコード

このコードは、vectorに要素を追加した後、.clear()を呼び出して全要素を削除し、コンテナが空になったことを確認します。

完成コード

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    vector<string> shopping_cart;
    
    shopping_cart.push_back("りんご");
    shopping_cart.push_back("みかん");
    shopping_cart.push_back("ぶどう");
    
    cout << "clear()前 -> 要素数 (size): " << shopping_cart.size() << endl;
    
    // 1. .clear()で、コンテナの全要素を削除
    shopping_cart.clear();
    
    cout << "clear()後 -> 要素数 (size): " << shopping_cart.size() << endl;
    
    // 2. .empty()で、コンテナが本当に空になったか確認
    if (shopping_cart.empty()) {
        cout << "買い物かごは空になりました。" << endl;
    }

    return 0;
}

実行結果

clear()前 -> 要素数 (size): 3
clear()後 -> 要素数 (size): 0
買い物かごは空になりました。

コードの解説

shopping_cart.clear();

  • 機能: コンテナ shopping_cart が保持している全ての要素を削除し、.size()0 にします。
  • 対象: std::vector, std::string, std::list, std::deque, std::map, std::set など、ほとんど全ての標準ライブラリコンテナ.clear() メンバ関数を持っています。

注意点: capacity() は変わらない

.clear()は要素を削除(デストラクタを呼び出し)しますが、std::vectorstd::string確保しているメモリ領域(キャパシティ)を解放するとは限りません

vector<int> numbers;
numbers.reserve(100); // 100要素分のメモリを確保
numbers.push_back(1);
numbers.push_back(2);

cout << numbers.size() << endl;     // -> 2
cout << numbers.capacity() << endl; // -> 100

numbers.clear();

cout << numbers.size() << endl;     // -> 0
cout << numbers.capacity() << endl; // -> 100 (メモリは確保されたまま)

これは、同じコンテナに再び要素が追加される際のパフォーマンスを考慮した仕様です。確保したメモリを完全に解放したい場合は、.shrink_to_fit() メソッドを呼び出すか、空のvectorswapするイディオムを使います。


まとめ

今回は、C++のコンテナの全要素を削除する .clear() メソッドについて解説しました。

  • .clear() を呼び出すだけで、コンテナの中身を簡単かつ効率的に空にできる
  • .clear() は要素を削除するが、vectorなどの確保済みメモリ (capacity) は解放しない場合がある。

コンテナを再利用する前のリセット処理として、.clear()は非常に便利なツールです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次