2012-04-03 13 views
5

Quando chiamo std::vector::reserve quando l'identificatore è di tipo std::vector<Foo*>reserve(...) non fa nulla:C++: std :: vector :: riserva non riservando quando contiene puntatori

std::vector<int*> bar; 
bar.reserve(20); 

//I expect bar.size to return 20... 
std::size_t sz = bar.size(); 
for(std::size_t i = 0; i < sz; ++i) { 
    //Do Stuff to all items! 
} 

Il suddetto for ciclo corre esattamente zero volte e bar. size() restituisce zero. Non ricordo se questo vale anche per tutti gli altri contenitori STL, ma in tal caso, incluso il comportamento per std :: vector: PERCHÉ?

+1

In aggiunta alle cose di seguito, penso che tu voglia usare anche 'std :: vector :: size_type' invece di solo' std :: size_t'. Non sono sicuro che sia così importante, ma ho visto questo come una sorta di "best practice" per STL. Puoi anche creare un'istanza di un vettore con un parametro di dimensione. Penso 'std :: vector bar (20);' per esempio dovrebbe allocare spazio per 20 puntatori interi per quella matrice. – ely

+2

Il codice pedante come 'for (std :: vector :: size_type i; i user763305

risposta

12

.reserve() non modifica la dimensione di un vettore. La funzione membro che stai cercando è .resize(). reserve() è semplicemente un'ottimizzazione. Se aggiungerai un gruppo di elementi a un vettore uno alla volta utilizzando push_back(), dicendogli quanti ne verranno aggiunti utilizzando reserve(), il codice potrebbe essere eseguito un po 'più velocemente. Ma chiamare semplicemente reserve() non cambia le dimensioni.

7

reserve modifica la capacità del vettore, non la dimensione. Probabilmente si desidera resize

6

vector::reserve() cambia la capacità di di un vettore, non la sua dimensione .

capacity è la quantità di memoria allocata internamente per contenere elementi del vettore. size è il numero di elementi effettivamente trattenuti dal vettore. vector::resize() colpisce quest'ultimo.