Domanda

Esiste un modo per ridimensionare un std :: vector per ridurre la capacità quando non ho più bisogno di spazio precedentemente riservato?

È stato utile?

Soluzione

STL efficace, di Scott Meyers, Articolo 17: Usa il trucco swap per tagliare la capacità in eccesso.

vector<Person>(persons).swap(persons);

Successivamente, persone è " ridotto per adattarsi " ;.

Questo si basa sul fatto che il costruttore di copie di vector alloca solo la memoria necessaria per gli elementi da copiare.

Altri suggerimenti

Se stai usando C ++ 11, puoi usare vec.shrink_to_fit () . Almeno in VS2010, questo è il trucco di scambio per te.

Crea un nuovo vettore temporaneo da quello esistente, quindi chiama il metodo swap su quello esistente, passando quello temporaneo. Lascia che il temporaneo (ora con il vecchio buffer sovradimensionato) esca dall'ambito.

Ehi presto, il tuo vettore ha esattamente la dimensione giusta per il suo contenuto.

Se questo suona come un sacco di copia e allocazione, tieni presente che questo è ciò che fa il vettore ogni volta che deve riallocare comunque il suo limite riservato corrente.

[Modifica] Sì, ho appena detto lo stesso di Sebastien in altre parole. Un altro caso di condizioni di gara stackoverflow ;-)

Il trucco di scambio è un modo efficace per ridurre la capacità di un oggetto, scambia il contenuto del mio vettore con uno appena creato con la costruzione della copia:

vector<Person>(persons).swap(persons);

Si noti che non esiste alcuna garanzia che persons.capacity (); dopo che il trucco di scambio è uguale a la dimensione: la capacità del vettore (persone) è la capacità dell'implementazione della libreria si riserva di vettori di dimensioni people.size ().

C ++ 11 ha introdotto shrink_to_fit () .

shrink_to_fit () e il trucco di scambio non garantiscono che la dimensione della capacità sia efficace ridotto alle dimensioni del vettore.

Shrink_to_fit () può comunque invalidare i tuoi iteratori (se si verifica una riallocazione) o non può: dipende dall'attuazione effettiva della libreria.

Tieni presente che il trucco di scambio richiede la costruzione di persone distruzioni di person.size (). Il shrink_to_fit () potrebbe evitare tutte queste copie e potrebbe lascia validi i tuoi iteratori. Poteva. Ma di tanto in tanto succede che shrink_to_fit () sia implementato in termini del trucco di scambio ...

Stai cercando un equivalente di QVector :: squeeze e temo che non esista esplicitamente nella STL. Cerca la risposta di Sébastien se è corretta per la tua implementazione STL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top