Si j'ai alloué un vecteur std :: à une certaine taille et capacité en utilisant resize()
et reserve()
au début de mon programme, est-il possible que pop_back()
puisse "casser" la capacité réservée et causer des réallocations? No. pop_back() ne rétrécira pas la capacité du vecteurEst-ce que std :: vector.pop_back() change la capacité du vecteur?
Répondre
Non, la seule façon de réduire la capacité d'un vecteur est le truc de swap
template< typename T, class Allocator >
void shrink_capacity(std::vector<T,Allocator>& v)
{
std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
}
et même qui est pas garanti selon la norme. (Bien qu'il soit difficile d'imaginer une implémentation où cela ne fonctionnerait pas.)
Pour autant que je sache, la prochaine version de la norme C++ (ce qui était autrefois C++ 0x, mais est maintenant devenu C++ 1x) aura std::vector<>::shrink_to_fit()
.
utilisez std::vector<T>(v).swap(v)
à la place.
Dupliquer la réponse de @ sbi; et voir mon commentaire sur le "truc de swap". – einpoklum
NO. Même que push_back
, pop_back
n'aura pas d'impact sur capacity()
. Ils ont un impact sur le size()
.
EDIT:
Je aurais dû dire push_back
ne changera pas la capacité lorsque le v.size() < v.capacity()
.
pop_XXX ne changera jamais la capacité. push_XXX peut changer la capacité si vous essayez de pousser plus de choses que la capacité le permet.
est ici le code de std :: vector :: pop_back()
void pop_back()
{ // erase element at end
if (!empty())
{ // erase last element
_Dest_val(this->_Alval, this->_Mylast - 1);
--this->_Mylast;
}
}
Fonction appelle seulement le Destructeur et diminue le pointeur sur le dernier élément. Code de VC (Release). Cela n'affecte donc pas la capacité (ou la réallocation) du vecteur.
Une mise en œuvre particulière n'est pas une information suffisante pour déterminer ce que la norme exige, et il se peut que ce ne soit pas la même implémentation que la personne qui pose la question. –
Sous C++ 11 on peut appeler shrink_to_fit() pour demander un vecteur (ainsi qu'une deque ou une chaîne) afin de réduire l'espace réservé à la capacité du vecteur. Notez cependant que cela dépend de l'implémentation: c'est simplement une demande et il n'y a aucune garantie. Vous pouvez essayer le code suivant:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> myVector;
for (auto i=1;i!=1e3;++i)
myVector.push_back(i);
cout << "Capacity: " << myVector.capacity() << endl;
myVector.reserve(2000);
cout << "Capacity (after reserving 2000): " << myVector.capacity() << endl;
myVector.shrink_to_fit();
cout << "Capacity (after shrink_to_fit): " << myVector.capacity();
}
- 1. std :: vecteur de fonctions
- 2. erreur Assertion dans std: vecteur utilisé dans std :: set_difference
- 3. Le comportement du vecteur chevauché :: insert
- 4. Comment trier un std objet :: vecteur par sa valeur flottante
- 5. Modification de la mémoire de réserve de C++ vecteur
- 6. Paramètres du navigateur/Test de capacité Page
- 7. itérer vecteur, supprimer certains éléments que je vais
- 8. Planification de la capacité du serveur Web: plus de cœurs que plus de mémoire
- 9. Quelle est la similarité entre un vecteur std :: et un tableau brut en C++?
- 10. Problème d'affectation de vecteur
- 11. Qu'est-ce que std :: safe_string?
- 12. Retourne un tableau sous-jacent à partir du vecteur
- 13. Comment utiliser std :: tri avec un vecteur de structures et de comparer la fonction?
- 14. std :: back_inserter pour un ensemble std ::?
- 15. Imiter la traînée UltraGridColumnChooser & drop capacité
- 16. Vecteurs, structs et std :: trouver
- 17. L'orientation de la Wiimote en tant que vecteur 3D
- 18. Test de la capacité Flash côté serveur
- 19. Windows Mobile/C: Attendre jusqu'à ce que la variable change
- 20. plusieurs foncteurs pour redéfinir l'ordre pour la fonction de tri du vecteur
- 21. vecteur normal du moins plan carrés dérivés
- 22. L'extension du paramètre bash change la chaîne d'origine
- 23. Boost phoenix ou lambda problème de bibliothèque: suppression d'éléments d'un vecteur std ::
- 24. Quelle est la meilleure façon de vérifier la capacité du système de fichiers en utilisant .Net?
- 25. Construire un vecteur à partir de composants contenus dans un autre type de vecteur
- 26. Comment examiner le contenu d'un vecteur std :: dans gdb, en utilisant le compilateur icc?
- 27. La version du fichier d'assemblage ne change pas?
- 28. python fileinput change la permission
- 29. Événement lorsque l'utilisateur change d'onglet du navigateur
- 30. std :: tri sans foncteurs
Je déconseille vivement cette astuce pour trois raisons: 1. La fonction ne fait pas nécessairement ce qu'elle dit. 2 Casse le principe de "la moindre surprise" 3. Il y a une énorme quantité de frais généraux, potentiellement - sans parler des effets secondaires potentiels de la copie plutôt que du déplacement. – einpoklum
@einpoklum: Oui, c'est sans bouger, et donc sous-optimal aujourd'hui. Mais cette réponse a presque dix ans, alors ... – sbi
@sbi: Je vous déconseillerais alors aussi bien :-( – einpoklum