C++ <vector> clear 関数
clearは vector 内で使用されるすべての要素をクリアする関数であり、コンテナを空にする最も簡単で効率的な方法です。
clearはコンテナクラスのメンバ関数であり、コンテナ内のすべての要素を削除し、コンテナを空にします。呼び出し後、コンテナのsize()は 0 になります。
clearはコンテナをリセットする標準的な方法であり、再開やメモリ解放が必要な場面でよく使用されます。
単語の意味: clear「クリア」を意味し、すべての要素を削除することです。
基本構文とパラメータ
clearはコンテナクラスのメンバ関数であり、呼び出しにパラメータは必要ありません。
構文形式
void clear();
パラメータの説明
- パラメータ: パラメータなし
clearいかなるパラメータも受け付けません。
関数の説明
- 戻り値:
void(戻り値なし)。 - 効果: コンテナ内のすべての要素を削除し、
size()は 0 になります。capacity()通常は変更されません(実装によって異なります)。 - 注意:
clearは基盤となるメモリを解放せず、容量は保持されます。同時にメモリを解放したい場合は、swapテクニック。
実例
一連の例を通じて、徹底的にclear使い方をマスターしましょう。
例1: 基本用法 - コンテナを空にする
実例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "クリア前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// すべての要素をクリア
numbers.clear();
std::cout << "クリア後 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "クリア前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// すべての要素をクリア
numbers.clear();
std::cout << "クリア後 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
実行結果の想定:
清空前 - size: 5, capacity: 5 清空后 - size: 0, capacity: 5
コードの解説:
clear()将size()は 0 になります。capacity()は変更されず、メモリは解放されません。
例2: クリア後に要素を再追加する
クリア後のコンテナは引き続き使用できます。
実例
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks;
// タスクを追加
tasks.push_back("C++ を学ぶ");
tasks.push_back("宿題を終わらせる");
tasks.push_back("ドキュメントを読む");
std::cout << "タスクリスト (" << tasks.size() << " 件):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
// タスクリストをクリア
tasks.clear();
std::cout << "\nクリア後 (" << tasks.size() << " 件)" << std::endl;
// 新しいタスクを追加できる
tasks.push_back("新しいタスク A");
tasks.push_back("新しいタスク B");
std::cout << "\n再追加後 (" << tasks.size() << " 件):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
return 0;
}
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks;
// タスクを追加
tasks.push_back("C++ を学ぶ");
tasks.push_back("宿題を終わらせる");
tasks.push_back("ドキュメントを読む");
std::cout << "タスクリスト (" << tasks.size() << " 件):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
// タスクリストをクリア
tasks.clear();
std::cout << "\nクリア後 (" << tasks.size() << " 件)" << std::endl;
// 新しいタスクを追加できる
tasks.push_back("新しいタスク A");
tasks.push_back("新しいタスク B");
std::cout << "\n再追加後 (" << tasks.size() << " 件):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
return 0;
}
実行結果の想定:
任务列表 (3 项): - 学习 C++ - 完成作业 - 阅读文档 清空后 (0 项) 重新添加后 (2 项): - 新任务 A - 新任务 B
コードの解説:
clear()クリア後、コンテナは引き続き使用できます。- 容量が保持されるため、要素を再追加する際にメモリを再割り当てする必要はありません。
例3: empty() を使用して空の状態を確認する
clear()後、次のものを使用してempty()コンテナが空かどうかを確認できます。
実例
#include <iostream>
#include <vector>
void processData(std::vector<int>& data) {
std::cout << "データ処理中、現在 " << data.size() << " 個の要素があります..." << std::endl;
// データを処理...
// データをクリア
data.clear();
std::cout << "データはクリアされました" << std::endl;
}
int main() {
std::vector<int> cache = {1, 2, 3, 4, 5};
// キャッシュ使用をシミュレート
for(int i = 0; i < 3; ++i) {
cache.push_back(cache.size() + 1);
std::cout << "要素追加後 - size: " << cache.size()
<< ", empty: " << (cache.empty() ? "true" : "false") << std::endl;
}
// キャッシュをクリア
cache.clear();
std::cout << "クリア後 - empty: " << (cache.empty() ? "true" : "false") << std::endl;
return 0;
}
#include <vector>
void processData(std::vector<int>& data) {
std::cout << "データ処理中、現在 " << data.size() << " 個の要素があります..." << std::endl;
// データを処理...
// データをクリア
data.clear();
std::cout << "データはクリアされました" << std::endl;
}
int main() {
std::vector<int> cache = {1, 2, 3, 4, 5};
// キャッシュ使用をシミュレート
for(int i = 0; i < 3; ++i) {
cache.push_back(cache.size() + 1);
std::cout << "要素追加後 - size: " << cache.size()
<< ", empty: " << (cache.empty() ? "true" : "false") << std::endl;
}
// キャッシュをクリア
cache.clear();
std::cout << "クリア後 - empty: " << (cache.empty() ? "true" : "false") << std::endl;
return 0;
}
実行結果の想定:
添加元素后 - size: 6, empty: false 添加元素后 - size: 7, empty: false 添加元素后 - size: 8, empty: false 清空后 - empty: true
コードの解説:
empty()を返すtrue当size() == 0とき。clear()後、empty()を返すtrue。
例4: メモリを完全に解放する
要素をクリアすると同時にメモリを解放したい場合は、次を使用できます。swapテクニック。
実例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers;
// 大量の要素を追加
for(int i = 0; i < 1000; ++i) {
numbers.push_back(i);
}
std::cout << "クリア前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法1: clear のみ(メモリ解放なし)
numbers.clear();
std::cout << "clear() 後 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法2: swap テクニックを使用(メモリ解放)
std::vector<int>().swap(numbers);
std::cout << "swap 後 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers;
// 大量の要素を追加
for(int i = 0; i < 1000; ++i) {
numbers.push_back(i);
}
std::cout << "クリア前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法1: clear のみ(メモリ解放なし)
numbers.clear();
std::cout << "clear() 後 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法2: swap テクニックを使用(メモリ解放)
std::vector<int>().swap(numbers);
std::cout << "swap 後 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
実行結果の想定:
清空前 - size: 1000, capacity: 1000 clear() 后 - size: 0, capacity: 1000 swap 后 - size: 0, capacity: 0
コードの解説:
clear()要素をクリアするだけで、容量は保持されます。std::vector一時的な空の vector を作成して numbers と交換し、メモリを完全に解放します。().swap(numbers)
例5: ループ内で clear を使用する
ループ内で使用でき、clearデータをリセットします。
実例
#include <iostream>
#include <vector>
int main() {
std::vector<int> buffer;
buffer.reserve(100);
// 複数回の処理をシミュレート
for(int round = 1; round <= 3; ++round) {
// データを入力
for(int i = 0; i < 10; ++i) {
buffer.push_back(round * 100 + i);
}
std::cout << "第 " << round << " ラウンド - 処理データ: ";
for(int n : buffer) {
std::cout << n << " ";
}
std::cout << std::endl;
// 処理後にクリアして、次のラウンドに備える
buffer.clear();
}
std::cout << 全ラウンド完了、最終 buffer サイズ: << buffer.size() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> buffer;
buffer.reserve(100);
// 複数回の処理をシミュレート
for(int round = 1; round <= 3; ++round) {
// データを入力
for(int i = 0; i < 10; ++i) {
buffer.push_back(round * 100 + i);
}
std::cout << "第 " << round << " ラウンド - 処理データ: ";
for(int n : buffer) {
std::cout << n << " ";
}
std::cout << std::endl;
// 処理後にクリアして、次のラウンドに備える
buffer.clear();
}
std::cout << 全ラウンド完了、最終 buffer サイズ: << buffer.size() << std::endl;
return 0;
}
コードの解説:
clear()ループ内でバッファのリセットに使用できます。- 組み合わせて
reserve使用することで、頻繁なメモリ割り当てを回避できます。
その他の拡張
C++ コンテナクラス <vector>