C++ <vector> clear 関数

C++ 容器类 <vector>C++ コンテナクラス <vector>


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;
}

実行結果の想定:

清空前 - size: 5, capacity: 5
清空后 - size: 0, capacity: 5

コードの解説:

  1. clear() 将 size()は 0 になります。
  2. 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;
}

実行結果の想定:

任务列表 (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;
}

実行結果の想定:

添加元素后 - 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;
}

実行結果の想定:

清空前 - size: 1000, capacity: 1000
clear() 后 - size: 0, capacity: 1000
swap 后 - size: 0, capacity: 0

コードの解説:

  • clear()要素をクリアするだけで、容量は保持されます。
  • std::vector().swap(numbers)一時的な空の vector を作成して 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;
}

コードの解説:

  • clear()ループ内でバッファのリセットに使用できます。
  • 組み合わせてreserve使用することで、頻繁なメモリ割り当てを回避できます。

C++ 容器类 <vector>C++ コンテナクラス <vector>

その他の拡張