2012-05-06 11 views
5

Non riesco a trovare questa informazione. Ho a che fare con una strana situazione qui dove sono all'interno di un ciclo e posso ottenere informazioni casuali in qualsiasi momento. Questa informazione deve essere memorizzata in un vettore. Ora ogni frame devo impostare questo vettore per assicurarmi che non esili lo spazio (sto scrivendo i valori in punti casuali nel vettore usando l'indicizzazione).Ridimensionamento vettoriale STL

Ora, supponendo che non ci sia modo di cambiare questo pezzo di codice, voglio sapere, il vettore "ignora" la funzione resize() se invio un argomento che è esattamente la dimensione del vettore? Dove posso trovare queste informazioni?

risposta

9

Da riferimento MSDN 1

Se la dimensione del contenitore è inferiore alla dimensione richiesta, _Newsize, elementi vengono aggiunti al vettore fino a raggiungere la dimensione richiesta. Se la dimensione del contenitore è maggiore della dimensione richiesta, gli elementi più vicini alla fine del contenitore vengono eliminati fino a quando il contenitore raggiunge la dimensione _Newsize. Se l'attuale dimensione del contenitore è uguale alla dimensione richiesta, viene acquistata alcuna azione

L'ISO C++ norma (pagina 485 2) specifica questo comportamento per vector::resize

void resize (size_type sz , T c = T()); 

if (sz > size()) 
    insert (end() , sz - size() , c); 
else if (sz < size()) 
    erase (begin()+ sz , end()); 
else 
; // Does nothing 

Quindi sì, il vettore lo ignora e non è necessario eseguire un controllo da soli.

0

Kinda-sorta.

Il semplice ridimensionamento di un vettore con ridimensiona() può comportare solo una maggiore quantità di memoria utilizzata dal vettore stesso (cambierà la quantità utilizzata dai suoi elementi). Se non c'è spazio sufficiente nello spazio riservato, verrà riallocato (ea volte preferiscono poggiare un po 'su se stessi, anche se potresti crescere). Se c'è già molto spazio per la dimensione richiesta e qualsiasi imbottitura che vuole fare, non ricrescerà.

Quando la specifica dice che gli elementi oltre la fine della dimensione saranno cancellati, significa sul posto. Fondamentalmente chiamerà _M_buff [i]. ~ T() per ogni elemento che sta cancellando. Quindi qualsiasi memoria che il tuo oggetto alloca verrà cancellata, assumendo un distruttore funzionante, ma lo spazio occupato dall'oggetto stesso (la sua dimensione) non lo sarà. Il vettore crescerà, crescerà e crescerà fino alla dimensione massima a cui lo dirai e non riproporterà mentre esiste.