目次
はじめに
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()
は非常に便利なツールです。