Question

Y a-t-il un moyen de redimensionner un std :: vector afin de réduire la capacité lorsque je n'ai plus besoin d'espace précédemment réservé?

Était-ce utile?

La solution

Effective STL, par Scott Meyers, élément 17: utilisez l'astuce swap pour réduire la capacité excédentaire.

vector<Person>(persons).swap(persons);

Après cela, personnes est "réduit pour s’adapter à".

Cela repose sur le fait que le constructeur de copie de vector n'alloue que la quantité de mémoire nécessaire pour les éléments copiés.

Autres conseils

Si vous utilisez C ++ 11, vous pouvez utiliser vec.shrink_to_fit () . Dans VS2010 au moins, le swap est fait pour vous.

Créez un nouveau vecteur temporaire à partir du vecteur existant, puis appelez la méthode de permutation sur la méthode existante en transmettant le temporaire. Entrez le champ temporaire (maintenant avec l'ancien tampon surdimensionné).

Hé hop, votre vecteur a exactement la bonne taille pour son contenu.

Si cela ressemble à beaucoup de copie et d'allocation, gardez à l'esprit que c'est ce que fait le vecteur chaque fois qu'il doit réallouer au-delà de sa limite réservée actuelle.

[Modifier] Oui, je viens de dire la même chose que Sébastien en plus de mots. Un autre cas de condition de course stackoverflow; -)

L’astuce d’échange est un moyen efficace de réduire la capacité d’un objet, il échange le contenu de mon vecteur avec un nouveau créé par construction de copie:

vector<Person>(persons).swap(persons);

Notez qu'il n'y a aucune garantie que persons.capacity (); après le tour de swap est égal à la taille: la capacité du vecteur (personnes) est la capacité de la bibliothèque mise en œuvre réserves aux vecteurs de taille personnes.size ().

C ++ 11 a présenté shrink_to_fit () .

shrink_to_fit () ainsi que l'astuce de swap ne garantissent pas que la capacité est effectivement réduit à la taille du vecteur.

Quoi qu’il en soit, shrink_to_fit () peut invalider vos itérateurs (si une réallocation se produit) ou ne peut pas: cela dépend de l'implémentation réelle de la bibliothèque.

N'oubliez pas que le truc d'échange nécessite person.size () de copier les constructions de Person et personne.size () destructions. 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'astuce d'échange ...

Vous recherchez un équivalent de QVector :: squeeze et je crains que cela n’existe pas explicitement dans la STL. Allez chercher la réponse de Sébastien si elle convient à votre implémentation STL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top