web-dev-qa-db-fra.com

Supprimer tous les éléments d'un c ++ std :: vector

J'essaie de tout supprimer d'un std::vector en utilisant le code suivant

vector.erase( vector.begin(), vector.end() );

mais ça ne marche pas.


Mise à jour: Clear ne détruit-il pas les éléments contenus par le vecteur? Je ne veux pas que, comme j'utilise toujours les objets, je veux juste vider le conteneur

59
michael

Je pense que vous devriez utiliser std::vector::clear :

vec.clear();

MODIFIER:

Clear ne détruit-il pas les éléments contenus par le vecteur?

Oui. Il appelle le destructeur de chaque élément du vecteur avant de renvoyer la mémoire. Cela dépend des "éléments" que vous stockez dans le vecteur. Dans l'exemple suivant, je stocke les objets eux-mêmes dans le vecteur:

class myclass
{
public:
    ~myclass()
    {

    }
...
};

std::vector<myclass> 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 vous souhaitez partager des objets entre différents conteneurs, par exemple, vous pouvez stocker des pointeurs sur ceux-ci. Dans ce cas, lorsque clear est appelé, seuls les pointeurs de la mémoire sont libérés, les objets réels ne sont pas touchés:

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

Pour la question dans le commentaire, je pense que getVector() est défini comme suit:

std::vector<myclass> getVector();

Peut-être que vous voulez retourner une référence:

// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector(); 
100
AraK

vector.clear() devrait fonctionner pour vous. Si vous voulez réduire la capacité de vector avec clear alors

std::vector<T>(v).swap(v);
33
aJ.

vector.clear () est effectivement identique à vector.erase (vector.begin (), vector.end ()).

Si votre problème consiste à appeler delete pour chaque pointeur contenu dans votre vecteur, essayez ceci:

#include <algorithm>

template< typename T >
struct delete_pointer_element
{
    void operator()( T element ) const
    {
        delete element;
    }
};

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

Clause de non-responsabilité standard: Code écrit dans le navigateur, non testé.

10
DevSolar

Utilisez v.clear () pour vider le vecteur.

Si votre vecteur contient des pointeurs, clear appelle le destructeur de l'objet mais ne supprime pas la mémoire référencée par le pointeur.

vector<SomeClass*> v(0);

v.Push_back( new SomeClass("one") );

v.clear();  //Memory leak where "one" instance of SomeClass is lost
9
Alex B

Est-ce que v.clear() ne fonctionne pas pour une raison quelconque?

4
Rob

Si vous conservez les pointeurs dans le conteneur et que vous ne voulez pas vous soucier de les détruire manuellement, utilisez boost shared_ptr . Voici un exemple pour std :: vector, mais vous pouvez l’utiliser pour n’importe quel autre conteneur STL (set, map, queue, ...)

#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>

struct foo
{
    foo( const int i_x ) : d_x( i_x )
    {
        std::cout << "foo::foo " << d_x << std::endl;
    }

    ~foo()
    {
        std::cout << "foo::~foo " << d_x << std::endl;
    }

    int d_x;
};

typedef boost::shared_ptr< foo > smart_foo_t;

int main()
{
    std::vector< smart_foo_t > foos;
    for ( int i = 0; i < 10; ++i )
    {
        smart_foo_t f( new foo( i ) );
        foos.Push_back( f );
    }

    foos.clear();

    return 0;
}
3
Dominic.wig

En plus des avantages susmentionnés de swap()., cette clear() ne garantit pas la désallocation de la mémoire. Vous pouvez utiliser swap() comme suit:

std::vector<T>().swap(myvector);
2
Samer