std::vector redimensionner à la baisse
La norme C++ semble faire aucune déclaration au sujet des effets secondaires sur la capacité, soit par
resize(n)
, avec n < size()
, ou clear()
.
Elle permet de faire une déclaration sur le coût amorti de push_back
et pop_back
- O(1)
Je peux envisager une mise en œuvre qui n'a l'habitude de tri de l'évolution de la capacité
ala PLC Algorithmes (par exemple, le double lors de l'élargissement, de réduire de moitié lorsque la diminution de size to < capacity()/4
).
(Cormen Lieserson Rivest Stein)
Quelqu'un aurait-il une référence pour toute mise en œuvre des restrictions?
Vous devez vous connecter pour publier un commentaire.
Appel
resize()
avec une plus petite taille n'a pas d'effet sur la capacité d'unvector
. Il ne sera pas libérer de la mémoire.La norme idiome pour la libération de la mémoire à partir d'un
vector
est àswap()
avec un vide temporairevector
:std::vector<T>().swap(vec);
. Si vous souhaitez redimensionner à la baisse, vous aurez besoin de copier à partir de votre vecteur d'origine dans un local temporaire vecteur et le swap, le vecteur résultant de votre original.Mise à jour: C++11 a ajouté une fonction membre
shrink_to_fit()
à cette fin, c'est un non-demande de liaison pour réduirecapacity()
àsize()
.En fait, la norme ne précise pas ce qui doit arriver:
C'est à partir de
vector
, mais le thème est le même pour tous les conteneurs (list
,deque
, etc...)void resize(size_type sz, T c = T());
C'est-à-dire: Si la taille spécifiée pour
resize
est inférieur au nombre d'éléments, ces éléments seront effacées à partir du conteneur. Concernantcapacity()
, cela dépend de ce queerase()
fait pour elle.Je ne trouve pas dans la norme, mais je suis sûr que
clear()
est définie comme:Par conséquent, les effets
clear()
a surcapacity()
est également liée aux effetserase()
a sur elle. Selon la norme:Cela signifie que les éléments seront détruits, mais le souvenir reste intact.
erase()
n'a pas d'effet sur la capacité, doncresize()
etclear()
également sans effet.resize
la baisse est maintenant documenté comme équivalente à une série depop_back()
appels et de ne paserase
. Le fait de supprimer la garantie que la capacité ne va pas changer? (Voir stackoverflow.com/q/19941601/103167)La capacité ne diminuera jamais. Je ne suis pas sûr si la norme indique explicitement, mais il est implicite: les itérateurs et les références à des éléments du vecteur ne doit pas être invalidé par
resize(n)
sin < capacity()
.Comme je l'ai vérifié pour gcc (mingw) la seule façon de vecteur libre capacité est ce que mattnewport dit.
Swaping avec d'autres teporary vecteur.
Ce code permet de elle pour gcc.