2008-10-06 17 views
5

Come argomento di funzione ottengo un vector<double>& vec (un vettore di output, quindi non-const) con lunghezza e valori sconosciuti. Voglio inizializzare questo vettore con una lunghezza specifica n con tutti gli zeri.(re) inizializza un vettore con una certa lunghezza con i valori iniziali

Questo funzionerà

vec.clear(); 
vec.resize(n, 0.0); 

E questo funzionerà così:

vec.resize(n); 
vec.assign(n, 0.0); 

è il secondo più efficiente (perché nessuno deallocazione di memoria/allocazione è coinvolto)? C'è un modo più efficiente per farlo?

risposta

9
std::vector<double>(n).swap(vec); 

Dopo questo, vec è garantito per avere dimensione e capacità n, con tutti i valori di 0,0.

Forse il modo più idiomatica dal C++ 11 è

vec.assign(n, 0.); 
vec.shrink_to_fit(); 

con la seconda linea opzionale. Nel caso in cui vec inizi con più di n elementi, se chiamare shrink_to_fit è un compromesso tra tenere su più memoria di quanto sia necessario eseguire una riassegnazione.

+0

Grazie per la correzione --- Ho aggiornato anche la mia voce. :-) –

9
std::vector<double>(n).swap(vec); 

Questo ha il vantaggio di compattare anche il tuo vettore. (Nel tuo primo esempio, clear() non garantisce per compattare il vettore.)

+0

È possibile che ridimensionamento() non riduca la capacità vettoriale. –

+0

Vero, scusate l'ho dato per scontato (poiché vedo chiaro() come un caso speciale di ridimensionamento()). :-) –

+0

Questo è C++ non standard: lo swap accetta un riferimento non const che non si legherà al vettore temporaneo. Visual C++ consente questa estensione come lingua. –

3

Beh diciamo completano i modi per farlo :)

vec.swap(std::vector<double>(n)); 
std::vector<double>(n).swap(vec); 
std::swap(vector<double>(n), vec); 
std::swap(vec, vector<double>(n)); 
+0

Gli ultimi due non hanno l'effetto desiderato, almeno sotto l'implementazione predefinita di std :: swap. :-) –

+1

In realtà funziona :) std :: swap è sovraccaricato nel vettore e chiama la funzione membro. Questo è richiesto dallo standard. –

2

Nessuno dei frammenti di codice che hai postato fare qualsiasi deallocazione di memoria, in modo che siano più o meno uguali.

Il trucco di scambio che tutti gli altri continuano a pubblicare richiederà più tempo per l'esecuzione, poiché assegnerà la memoria originariamente utilizzata dal vettore. Questo può o non può essere desiderabile.

Problemi correlati