La classe std::vector
gestisce automaticamente la sua memoria interna. Si espanderà per contenere tanti oggetti quanti ne mettete dentro, ma in generale non si restringerà da solo quando rimuovete gli oggetti (anche se, naturalmente, rilascerà la memoria quando distruggerà).
Il std::vector
ha due concetti rilevanti di "dimensione". La prima è la dimensione "riservata", ovvero la quantità di memoria allocata dal sistema da utilizzare per la memorizzazione di elementi vettoriali. Il secondo è la dimensione "usata", ovvero quanti elementi sono logicamente nel vettore. Chiaramente, la dimensione riservata deve essere grande almeno quanto la dimensione usata. Puoi scoprire la dimensione usata con il metodo size()
(che sono sicuro che tu già conosci), e puoi scoprire la dimensione riservata usando il metodo capacity()
.
In genere, quando le dimensioni utilizzate e quelle riservate sono le stesse e si tenta di inserire un nuovo elemento, il vettore allocherà un nuovo buffer interno del doppio della dimensione riservata precedente e copierà tutti gli elementi esistenti in tale buffer . Questo è trasparente per te, tranne per il fatto che invaliderà qualsiasi iteratore che hai in mano. Come ho notato prima, AFAIK, la maggior parte delle implementazioni STL non ridurrà mai le dimensioni riservate come risposta a una cancellazione.
Purtroppo, mentre è possibile forzare un vettore di aumento sua dimensione riservata utilizzando il metodo reserve()
, questo non funziona per diminuire la capacità riservata. Per quanto posso dire, la soluzione migliore per effettuare una riduzione della capacità è quella di effettuare le seguenti operazioni:
std::vector<Bullet>(myVector).swap(myVector);
Che cosa questo farà fare è creare un vettore temporanea che è una copia del vettore originale (ma con il capacità minima necessaria), quindi scambiare i buffer interni dei due vettori.Questo farà sì che il tuo vettore originale abbia gli stessi dati ma una dimensione riservata potenzialmente più piccola.
Ora, poiché la creazione di tale copia temporanea è un'operazione relativamente costosa (ovvero richiede molto più tempo del processore rispetto alle normali letture/inserzioni/eliminazioni), non si desidera eseguirla ogni volta che si cancella un elemento. Per lo stesso motivo, questo è il motivo per cui il vettore raddoppia le dimensioni riservate invece di aumentarle di 1 quando è necessario superare la dimensione esistente. Pertanto, quello che vorrei raccomandare è che dopo aver cancellato un numero relativamente grande di elementi, e sai che non ne aggiungerai altri molto presto, esegui il "trucco" di scambio sopra per ridurre la capacità.
Infine, si può anche prendere in considerazione l'utilizzo di qualcosa di diverso da un std::vector
per questo. Cancellare elementi dal centro di un vettore, che sembra che si stiano facendo di frequente, è un'operazione lenta rispetto a molti altri tipi di strutture di dati (poiché il vettore deve copiare tutti gli elementi successivi di uno slot per riempire il buco) . Quale struttura dati è la migliore per i tuoi scopi dipende da che cosa stai facendo con i dati.
Come state? STL, Boost, roll-your-own o qualcos'altro? – John
Il vettore STL è quello – jmasterx
È possibile utilizzare 'std :: vector :: resize()' per ridurre le dimensioni. Vedere http://www.cplusplus.com/reference/stl/vector/resize –