Comment faire pour réduire std:: vecteur?
y a-t-il un moyen de redimensionner un std::vector
pour réduire la capacité lorsque je n'ai plus besoin d'espace réservé auparavant?
5 réponses
Effective STL, par Scott Meyers, Point 17: Utilisez la fonction swap
astuce pour couper l'excès de capacité.
vector<Person>(persons).swap(persons);
Après cela, persons
est "rétréci pour s'adapter".
Cela repose sur le fait que vector
constructeur de copie alloue seulement autant que la mémoire nécessaire pour les éléments à copier.
si vous utilisez C++11, Vous pouvez utiliser vec.shrink_to_fit()
. En VS2010 au moins, ça fait l'affaire de l'échange pour vous.
créer un nouveau vecteur temporaire à partir du vecteur existant, puis appeler la méthode de swap sur le vecteur existant, en passant par le vecteur temporaire. Laissez temporaire (maintenant avec l'ancien, surdimensionné, tampon) hors de portée.
hop, votre vecteur a exactement la bonne taille pour son contenu.
si cela ressemble à beaucoup de copie et d'attribution - gardez à l'esprit que c'est ce que vecteur fait chaque fois qu'il doit realloc au-delà de sa limite actuelle réservée de toute façon.
[Edit] Oui, j'ai dit la même chose que Sébastien en plus de mots. Un autre cas de stackoverflow de la course ;-)
Le swap trick est un moyen efficace de réduire la capacité d'un objet, il échange le contenu de mon vecteur avec un nouveau créé par la construction de copie:
vector<Person>(persons).swap(persons);
notez qu'il n'y a aucune garantie que les personnes.capacité(); après l'échange astuce est égal à la taille: la capacité du vecteur (personnes) est la capacité de la bibliothèque mise en œuvre réserves aux vecteurs des personnes de taille.taille.)(
C++11 introduit shrink_to_fit () .
shrink_to_fit () ainsi que l'astuce de swap ne garantit pas la taille de la capacité est effectivement réduit à la taille du vecteur.
de toute façon shrink_to_fit () peut invalider vos itérateurs (si une réallocation se produit) ou ne peut pas: il dépend de la mise en œuvre effective de la bibliothèque.
gardez à l'esprit que le Trick swap nécessite des personnes.taille () copie constructions de la personne et personne.taille() destruction. Le shrink_to_fit () pourrait éviter toute cette copie et pourrait laissez vos itérateurs valides. Pourrait. Mais de temps en temps il arrive que shrink_to_fit() soit implémenté dans termes de l'échange truc...
vous cherchez un équivalent de QVector::squeeze et je crains qu'il n'existe pas explicitement dans le STL. Allez voir la réponse de Sébastien si elle est correcte pour votre implémentation STL.