Question

Se référant à l'article GotW 54 par Herb Sutter, il explique à propos de

  1. La bonne façon de "Shrink-To-Fit" une vecteur ou deque et

  2. La bonne façon de supprimer complètement un vecteur ou deque

  

Peut-on utiliser juste container.resize()   et container.clear() pour la tâche ci-dessus   ou suis-je manque quelque chose?

Était-ce utile?

La solution

Il y a deux choses différentes qu'un vecteur détient: size Vs capacity. Si vous venez resize le vecteur, il n'y a aucune garantie que la capacité (la quantité de mémoire réservée) doit changer. resize est une opération trait à la quantité que vous utilisez, pas combien la capacité vectorielle est.

Ainsi, par exemple.

size     == how much you are using
capacity == how much memory is reserved
vector<int> v(10);

v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear()    // size == 0 but capacity (may or may) not be changed

En fin de compte, la capacité ne devrait pas changé sur toutes les opérations, car cela apporterait beaucoup d'allocation mémoire / frais généraux de désaffectation. Il dit que si vous avez besoin " deallocate " la mémoire réservé par le vecteur, le faire.

Autres conseils

Ni redimensionner () ni travail clair (). Le .capacity() d'un vecteur est garanti d'être au moins aussi grand que le size() actuel du vecteur, et garanti au moins aussi grande que la capacité reserve()d. En outre, ce .capacity() ne rétrécit pas, il est donc aussi au moins aussi grand que tout size() précédent ou reserve()ation.

Maintenant, le .capacity() d'un vecteur est simplement la mémoire qu'il a réservé. Souvent, pas tous que la mémoire cotains objets. Redimensionnement supprime les objets, mais ne recycle pas la mémoire. Un vecteur ne peut recycler son tampon de mémoire lors de l'allocation d'un tampon plus large.

L'astuce swap fonctionne en copiant tous les ojets à un plus petit, mémoire tampon plus appropriée. Ensuite, le tampon de mémoire d'origine peut être recyclé. Cela semble violer la déclaration précédente que la mémoire tampon de mémoire d'un vecteur ne peut que croître. Cependant, avec le truc d'échange, vous avez temporairement 2 vecteurs.

Le vecteur a la taille et la capacité. Il peut contenir des éléments X, mais ont de mémoire non initialisée en magasin pour les éléments Y plus. Dans un effacement de la mise en œuvre typique, redimensionner (lors du redimensionnement de la taille plus petite) et claire ne compromettent pas la capacité. Le vecteur conserve la mémoire autour de lui-même, si vous voulez ajouter de nouveaux éléments à à un moment plus tard

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