C++ <vector> функция clear

класс контейнера C++ <vector>


clearиспользуется в vector, чтобыочистить все элементыЭта функция — самый простой и эффективный способ очистить контейнер.

clearявляется функцией-членом класса контейнера, используемой дляудаления всех элементов из контейнера, делая контейнер пустым. После вызова у контейнераsize()станет 0.

clearявляется стандартным методом сброса контейнера, часто используется в сценариях, когда нужно начать заново или освободить память.

Определения слов: 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 << "Перед очисткой - размер: " << numbers.size()
              << ", вместимость: " << numbers.capacity() << std::endl;

    // Очистить все элементы
    numbers.clear();

    std::cout << "После очистки - размер: " << numbers.size()
              << ", вместимость: " << 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()Qaujijaqtuq container imaittuq.

Пример

#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 << После добавления элементов - размер: << cache.size()
                  << ", пусто: " << (cache.empty() ? "true" : "false") << std::endl;
    }

    // Очистить кеш
    cache.clear();
    std::cout << После очистки - пусто: << (cache.empty() ? "true" : "false") << std::endl;

    return 0;
}

Ожидаемый вывод:

添加元素后 - size: 6, empty: false
添加元素后 - size: 7, empty: false
添加元素后 - size: 8, empty: false
清空后 - empty: true

Анализ кода:

  • empty()returntrueКогдаsize() == 0Когда.
  • clear()После,empty()returntrue。

Пример 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 << "Перед очисткой - размер: " << numbers.size()
              << ", вместимость: " << numbers.capacity() << std::endl;

    // Способ 1: Только clear (без освобождения памяти)
    numbers.clear();
    std::cout << "После clear() - размер: " << numbers.size()
              << ", вместимость: " << numbers.capacity() << std::endl;

    // Способ 2: Используйте трюк с swap (для освобождения памяти)
    std::vector<int>().swap(numbers);
    std::cout << "После swap - размер: " << numbers.size()
              << ", вместимость: " << 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.size() << std::endl;

    return 0;
}

Анализ кода:

  • clear()Может использоваться в цикле для сброса буфера.
  • КоординацияreserveЕго использование позволяет избежать частых выделений памяти.

класс контейнера C++ <vector>

Другие расширения