web-dev-qa-db-fra.com

Un appel à std :: vector :: clear () mettra-t-il std :: vector :: capacity () à zéro?

Si j'utilise .reserve (éléments) sur un vecteur, celui-ci allouera suffisamment de mémoire pour pouvoir deviner le nombre d'éléments dont j'ai besoin.

Si j'utilise par la suite .clear (), est-ce que cela effacera simplement le vecteur ou sauvegardera ma réserve définie précédemment?

merci.

42
monkeyking

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

    std::vector<int> v1;

    // somehow increase capacity

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

Remarque: Cette ancienne réponse recevant toujours des votes positifs (les lecteurs la lisant), je ressens le besoin d'ajouter que C++ 11 a ajouté std::vector<...>::shrink_to_fit(), qui demande au vecteur de supprimer la capacité inutilisée. 

46
sbi

Il ne sera probablement pas libérer 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 la norme dit seulement que la post-condition est que size() == 0 bien que je n'ai pas rencontré d'implémentation vector qui ne conserve pas la mémoire réservée.

10
Andreas Brinck

Non ça ne va pas. 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 Visant à réduire la capacité () à la taille (). [ Remarque: La demande n'est pas contraignante pour Autoriser une latitude pour Des optimisations spécifiques à la mise en œuvre . —Fin note]

8
JRL

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 de taille 0, mais la capacité reste inchangée.

1
jasonline

Cela n'affectera pas la taille de la mémoire tampon sous-jacente. C'est pourquoi vous devez utiliser des astuces telles que this pour supprimer le tampon ou le réduire.

0
sharptooth