Est-ce qu’un appel à std :: vector :: clear () mettra std :: vector :: capacity () à zéro?

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 va-t-il simplement effacer le vecteur ou enregistrer ma réserve précédemment définie?

Merci.

Il est spécifié que std::vector::clear() affecte la taille. Cela pourrait ne pas affecter la capacité. Pour réinitialiser la capacité, utilisez le truc d’échange :

  std::vector v1; // somehow increase capacity std::vector().swap(v1); 

Note: Etant donné que cette ancienne réponse reçoit toujours des abonnements (donc les gens le lisent), je ressens le besoin d’append que C ++ 11 a ajouté std::vector<...>::shrink_to_fit() , qui demande au vecteur supprimer la capacité inutilisée.

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

EDIT: Ok, juste vérifié et le standard dit seulement que la post-condition est cette size() == 0 bien que je ne sois pas tombé sur une implémentation vector qui ne retient pas la mémoire réservée.

Non ça ne va pas. Essayez-le en appelant vector::capacity() .

Une autre preuve de ceci est l’apparition de shrink_to_fit . Le document de travail de la norme mentionne:

Remarques: shrink_to_fit est une requête non contraignante visant à réduire la capacité () à la taille (). [Remarque: la demande est non contraignante pour laisser une latitude aux optimisations spécifiques à l’implémentation . —End note]

Non, il ne définira pas reserve () à 0. L’appel de clear () appelle les destructeurs de chaque élément et les supprime du vecteur, laissant la taille du conteneur à 0, mais la capacité rest inchangée.

Cela n’affectera pas la taille de la mémoire tampon sous-jacente. C’est pourquoi vous devez utiliser des astuces comme celle-ci pour éliminer le tampon ou le réduire.