2009-10-08 11 views

Répondre

18

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().

+1

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

+0

@einpoklum: Oui, c'est sans bouger, et donc sous-optimal aujourd'hui. Mais cette réponse a presque dix ans, alors ... – sbi

+0

@sbi: Je vous déconseillerais alors aussi bien :-( – einpoklum

4

utilisez std::vector<T>(v).swap(v) à la place.

+0

Dupliquer la réponse de @ sbi; et voir mon commentaire sur le "truc de swap". – einpoklum

1

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().

2

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.

1

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.

+1

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

4

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(); 

} 
Questions connexes