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.
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.
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.
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]
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.
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.