2015-11-12 17 views
7

Vorrei creare un vettore di un tipo complesso, leggendo i singoli elementi di uno stream. Conosco le dimensioni del vettore in anticipo. È meglio specificare il numero di elementi nel costruttore vettoriale o usando il metodo di riserva? Quale di queste due è meglio?Compilazione di un vettore con un numero noto di elementi: specificare le sue dimensioni nel costruttore o utilizzando il metodo di riserva?

int myElementCount = stream.ReadInt(); 
vector<MyElement> myVector(myElementCount); 
for (int i = 0; i < myElementCount; i++) 
{ 
    myVector[i] = stream.ReadMyElement(); 
} 

o

int myElementCount = stream.ReadInt(); 
vector<MyElement> myVector; 
myVector.reserve(myElementCount); 
for (int i = 0; i < myElementCount; i++) 
{ 
    myVector.push_back(stream.ReadMyElement()); 
} 

cosa circa il caso in cui ho appena creare un vettore di int o qualche altro tipo semplice.

+0

Utilizzare 'resize()' invece di 'reserve()', è una confusione comune per i newb. –

+3

@ πάνταῥεῖ Perché? Non 'ridimensiona' anche il default costruisce gli oggetti? OP sta facendo il 'push_back' in ogni caso. Forse sono confuso anche io :) – vsoftco

risposta

6

Dipende da cosa è lo MyElement, in particolare da operator=, quindi è in genere il solito "prova entrambi e usa quello più veloce per te". C'è una terza scelta, usare C++ 11 e emplace_back, specialmente se MyElement è pesante.

Come datapoint, per int o double ho scoperto che utilizzando il costruttore (o resize()) e [] è più veloce. In particolare, in questo modo il ciclo è molto più facile da vettorizzare per il compilatore.

+2

Commento laterale: 'emplace_back' e' push_back' sono equivalenti su rvalue (che è ciò che l'OP sta usando), quest'ultimo sposta anche l'oggetto. Ma sono d'accordo che 'emplace_back' afferma chiaramente l'intenzione. – vsoftco

+0

* "specialmente ciò che il suo' operator = 'fa" * - l'approccio 'push_back' implica (possibilmente elidata) la copia degli elementi di costruzione (con l'allocatore predefinito, che è fondamentalmente un nuovo posizionamento), mentre l'approccio di dimensioni del costruttore implica la costruzione predefinita quindi assegnazione, quindi i costi relativi di tutte quelle operazioni sono importanti, così come è se il compilatore può ottimizzare i controlli di capacità ripetuti e gli incrementi di dimensione in modo efficace quindi fare lo stesso ciclo di svolgimento o altre ottimizzazioni .... –