Saltar al contenido

Eliminar todos los elementos de un C++ std::vector

Puede que se de el caso de que halles algún error en tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

Creo que deberías usar std::vector::clear:

vec.clear();

EDITAR:

¿No borra la destrucción de los elementos que contiene el vector?

Sí lo hace. Llama al destructor de cada elemento en el vector antes de devolver la memoria. Eso depende de qué “elementos” esté almacenando en el vector. En el siguiente ejemplo, estoy almacenando los objetos mismos dentro del vector:

class myclass

public:
    ~myclass()
    

    
...
;

std::vector myvector;
...
myvector.clear(); // calling clear will do the following:
// 1) invoke the deconstrutor for every myclass
// 2) size == 0 (the vector contained the actual objects).

Si desea compartir objetos entre diferentes contenedores, por ejemplo, puede almacenar punteros a ellos. En este caso, cuando clear se llama, solo se libera la memoria de punteros, los objetos reales no se tocan:

std::vector myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).

Para la pregunta en el comentario, creo getVector() se define así:

std::vector getVector();

Tal vez quieras devolver una referencia:

// vector.getVector().clear() clears m_vector in this case
std::vector& getVector(); 

vector.clear() debería funcionar para ti. En caso de que desee reducir la capacidad de la vector junto con claro entonces

std::vector(v).swap(v);

vector.clear() es efectivamente lo mismo que vector.erase( vector.begin(), vector.end() ).

Si tu problema es sobre llamar delete para cada puntero contenido en su vector, intente esto:

#include 

template< typename T >
struct delete_pointer_element

    void operator()( T element ) const
    
        delete element;
    
;

// ...
std::for_each( vector.begin(), vector.end(), delete_pointer_element() );

Editar: Código vuelto obsoleto por C++11 range-for.

Si te animas, eres capaz de dejar un ensayo acerca de qué te ha parecido este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *