Función clear de <vector> en C++

C++ 容器类 <vector>Clase contenedora <vector> en C++


clearEs la función en vector que se utiliza paravaciar todos los elementos, es el método más simple y eficiente para vaciar el contenedor.

cleares una función miembro de la clase contenedora, utilizada paraeliminar todos los elementos del contenedor, lo que hace que el contenedor quede vacío. Después de la llamada, elsize()tamaño se convertirá en 0.

cleares el método estándar para restablecer el contenedor, utilizado a menudo en escenarios donde se necesita reiniciar o liberar memoria.

Definición de la palabra: clearsignifica 'limpiar', es decir, eliminar todos los elementos.


Sintaxis básica y parámetros

cleares una función miembro de la clase contenedora; llamarla no requiere ningún parámetro.

Formato de sintaxis

void clear();

Descripción de parámetros

  • Parámetro: sin parámetros
    • clearNo acepta ningún parámetro.

Descripción de la función

  • Valor de retorno: void(sin valor de retorno).
  • Efecto: elimina todos los elementos del contenedor,size()el tamaño se convierte en 0.capacity()La capacidad generalmente permanece sin cambios (depende de la implementación específica).
  • Nota: clearno libera la memoria subyacente, la capacidad permanece sin cambios. Si se desea liberar memoria al mismo tiempo, se puede usarswapla técnica.

Ejemplos

Vamos a dominar completamente, mediante una serie de ejemplos,clearsu uso.

Ejemplo 1: Uso básico - Vaciar el contenedor

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    std::cout << "Antes de vaciar - size: " << numbers.size()
              << ", capacity: " << numbers.capacity() << std::endl;

    // Vaciar todos los elementos
    numbers.clear();

    std::cout << "Después de vaciar - size: " << numbers.size()
              << ", capacity: " << numbers.capacity() << std::endl;

    return 0;
}

Resultado esperado:

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

Análisis del código:

  1. clear()va asize()El tamaño se convierte en 0.
  2. capacity()La capacidad permanece sin cambios, la memoria no se libera.

Ejemplo 2: Volver a agregar elementos después de vaciar

El contenedor vaciado se puede seguir usando.

Ejemplo

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> tasks;

    // Agregar tareas
    tasks.push_back("Aprender C++");
    tasks.push_back("Completar la tarea");
    tasks.push_back("Leer documentación");

    std::cout << "Lista de tareas (" << tasks.size() << " elementos):" << std::endl;
    for(const auto& t : tasks) {
        std::cout << "- " << t << std::endl;
    }

    // Vaciar la lista de tareas
    tasks.clear();

    std::cout << "\n"Después de vaciar (" << tasks.size() << " elementos)" << std::endl;

    // Se pueden seguir agregando nuevas tareas
    tasks.push_back("Nueva tarea A");
    tasks.push_back("Nueva tarea B");

    std::cout << "\n"Después de volver a agregar (" << tasks.size() << " elementos):" << std::endl;
    for(const auto& t : tasks) {
        std::cout << "- " << t << std::endl;
    }

    return 0;
}

Resultado esperado:

任务列表 (3 项):
- 学习 C++
- 完成作业
- 阅读文档

清空后 (0 项)

重新添加后 (2 项):
- 新任务 A
- 新任务 B

Análisis del código:

  • clear()Después de vaciar, el contenedor se puede seguir usando.
  • Como la capacidad permanece sin cambios, no es necesario reasignar memoria al volver a agregar elementos.

Ejemplo 3: Usar empty() para verificar el estado de vaciado

clear()Después, se puede usarempty()para comprobar si el contenedor está vacío.

Ejemplo

#include <iostream>
#include <vector>

void processData(std::vector<int>& data) {
    std::cout << "Procesando datos, actualmente hay " << data.size() << " elementos..." << std::endl;

    // Procesar datos...

    // Limpiar datos
    data.clear();
    std::cout << "Datos limpiados" << std::endl;
}

int main() {
    std::vector<int> cache = {1, 2, 3, 4, 5};

    // Simular el uso de caché
    for(int i = 0; i < 3; ++i) {
        cache.push_back(cache.size() + 1);
        std::cout << "Después de agregar elementos - size: " << cache.size()
                  << ", empty: " << (cache.empty() ? "true" : "false") << std::endl;
    }

    // Vaciar la caché
    cache.clear();
    std::cout << "Después de vaciar - empty: " << (cache.empty() ? "true" : "false") << std::endl;

    return 0;
}

Resultado esperado:

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

Análisis del código:

  • empty()devuelvetrueCuandosize() == 0cuando.
  • clear()después,empty()devuelvetrue。

Ejemplo 4: Liberar memoria por completo

Si se desea liberar memoria al mismo tiempo que se vacían los elementos, se puede usarswapla técnica.

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;

    // Agregar muchos elementos
    for(int i = 0; i < 1000; ++i) {
        numbers.push_back(i);
    }

    std::cout << "Antes de vaciar - size: " << numbers.size()
              << ", capacity: " << numbers.capacity() << std::endl;

    // Método 1: solo clear (sin liberar memoria)
    numbers.clear();
    std::cout << "Después de clear() - size: " << numbers.size()
              << ", capacity: " << numbers.capacity() << std::endl;

    // Método 2: usar el truco de swap (liberar memoria)
    std::vector<int>().swap(numbers);
    std::cout << "Después de swap - size: " << numbers.size()
              << ", capacity: " << numbers.capacity() << std::endl;

    return 0;
}

Resultado esperado:

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

Análisis del código:

  • clear()Solo vacía los elementos, la capacidad permanece sin cambios.
  • std::vector().swap(numbers)Crea un vector vacío temporal y lo intercambia con numbers, liberando completamente la memoria.

Ejemplo 5: Usar clear en un bucle

Se puede usar en un bucleclearpara restablecer los datos.

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> buffer;
    buffer.reserve(100);

    // Simular múltiples rondas de procesamiento
    for(int round = 1; round <= 3; ++round) {
        // Rellenar datos
        for(int i = 0; i < 10; ++i) {
            buffer.push_back(round * 100 + i);
        }

        std::cout << "Ronda " << round << " - Procesando datos: ";
        for(int n : buffer) {
            std::cout << n << " ";
        }
        std::cout << std::endl;

        // Vaciar después de procesar, preparar la siguiente ronda
        buffer.clear();
    }

    std::cout << "Todas las rondas completadas, tamaño final del buffer: " << buffer.size() << std::endl;

    return 0;
}

Análisis del código:

  • clear()Se puede usar en un bucle para restablecer el búfer.
  • Combinado conreserveel uso, se puede evitar la asignación frecuente de memoria.

C++ 容器类 <vector>Clase contenedora <vector> en C++

Otras extensiones