目次
はじめに
C++でvectorやlist、mapなどのコンテナを再利用する際、「コンテナの中身を全て削除して、空の状態に戻したい」という場面は頻繁にあります。
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::vectorやstd::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() メソッドを呼び出すか、空のvectorとswapするイディオムを使います。
まとめ
今回は、C++のコンテナの全要素を削除する .clear() メソッドについて解説しました。
.clear()を呼び出すだけで、コンテナの中身を簡単かつ効率的に空にできる。.clear()は要素を削除するが、vectorなどの確保済みメモリ (capacity) は解放しない場合がある。
コンテナを再利用する前のリセット処理として、.clear()は非常に便利なツールです。
