45 votes

un appel à std :: vector.clear () mettra-t-il également à zéro std :: vector.reserve ()?

Si j'utilise .reserve (items) sur un vecteur, le vecteur allouera suffisamment de mémoire pour que je devine le nombre d'éléments dont j'ai besoin.

Si j'utilise plus tard .clear (), cela effacera-t-il simplement le vecteur ou enregistrera-t-il ma réserve définie précédemment?

Merci.

49voto

sbi Points 100828

std::vector<T>::clear() n'affecte que la taille, pas la capacité. Pour réinitialiser la capacité, utilisez l' astuce de swap :

     std::vector<int> v1;

    // somehow increase capacity

    std::vector<int>().swap(v1);
 

Remarque: Étant donné que cette ancienne réponse reçoit toujours des votes positifs (donc les gens la lisent), je ressens le besoin d'ajouter que C ++ 11 a ajouté std::vector<...>::shrink_to_fit() , ce qui demande au vecteur de supprimer la capacité inutilisée.

11voto

Andreas Brinck Points 23806

Il ne libérera probablement pas la mémoire réservée bien que je ne pense pas que le comportement soit spécifié dans la norme.

EDIT: Ok, je viens de vérifier et la norme dit seulement que la post-condition est que size() == 0 bien que je n'aie pas rencontré une implémentation vector qui ne tienne pas à la réserve Mémoire.

8voto

JRL Points 36674

Non, ce ne sera pas le cas. Essayez-le en appelant vector::capacity() .

Une autre preuve de cela est l'apparition de shrink_to_fit . Le projet de travail de la norme mentionne:

Remarques: shrink_to_fit est une requête non contraignante pour réduire la capacité () à size (). [Remarque: La demande n'est pas contraignante pour laisser la latitude aux optimisations spécifiques à l'implémentation . -fin note]

1voto

jasonline Points 2307

Non, il ne mettra pas reserve () à 0. L'appel de clear () appelle les destructeurs de chaque élément et les supprime du vecteur, laissant le conteneur avec une taille de 0, mais la capacité reste inchangée.

0voto

sharptooth Points 93379

Cela n'affectera pas la taille du tampon sous-jacent. C'est pourquoi vous devez utiliser des astuces comme celle-ci pour vous débarrasser du tampon ou le réduire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X