C++ <vector> функция clear
clearиспользуется в vector, чтобыочистить все элементыЭта функция — самый простой и эффективный способ очистить контейнер.
clearявляется функцией-членом класса контейнера, используемой дляудаления всех элементов из контейнера, делая контейнер пустым. После вызова у контейнераsize()станет 0.
clearявляется стандартным методом сброса контейнера, часто используется в сценариях, когда нужно начать заново или освободить память.
Определения слов: clearозначает "clear", то есть удаление всех элементов.
Базовый синтаксис и параметры
clearявляется функцией-членом классов контейнеров; для её вызова не требуются параметры.
Формат синтаксиса
void clear();
Описание параметра
- Параметр: Нет параметров
clearне принимает никаких параметров.
Описание функции
- Возвращаемое значение:
void(нет возвращаемого значения). - Действие: удаляет все элементы из контейнера,
size()становится 0.capacity()обычно остаётся без изменений (в зависимости от конкретной реализации). - Примечание:
clearне освобождает выделенную память, и ёмкость остаётся неизменной. Чтобы одновременно освободить память, можно использоватьswapтехнологию.
Пример
Давайте тщательно освоим это на серии примеров.clearИспользование.
Пример 1: базовое использование — очистка контейнера
Пример
#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
Анализ кода:
clear()будетsize()становится 0.capacity()остаётся без изменений, а память не освобождается.
Пример 2: повторное добавление элементов после очистки
Очищенный контейнер можно продолжать использовать.
Пример
#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 <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 <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Создайте временный пустой vector и поменяйте его местами с numbers, чтобы полностью освободить память.().swap(numbers)
Пример 5: Использование clear в цикле
Можно использовать в циклеclearдля сброса данных.
Пример
#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Его использование позволяет избежать частых выделений памяти.
Другие расширения