(ri) inizializzare un vettore ad una certa lunghezza con valori iniziali
-
05-07-2019 - |
Domanda
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 su una lunghezza specifica n con tutti gli zeri.
Funzionerà
vec.clear();
vec.resize( n, 0.0 );
E funzionerà anche questo:
vec.resize( n );
vec.assign( n, 0.0 );
Il secondo è più efficiente (perché non sono coinvolti allocazione / allocazione della memoria)? C'è un modo più efficiente per farlo?
Soluzione
std::vector<double>(n).swap(vec);
Successivamente, vec ha la garanzia di avere dimensione e capacità n, con tutti i valori 0.0.
Forse il modo più idiomatico da quando C ++ 11 è
vec.assign(n, 0.);
vec.shrink_to_fit();
con la seconda riga opzionale. Nel caso in cui vec
inizi con più di n
elementi, se chiamare shrink_to_fit
è un compromesso tra trattenere su più memoria di quanto sia necessario rispetto a eseguire una riassegnazione.
Altri suggerimenti
std::vector<double>(n).swap(vec);
Questo ha il vantaggio di compattare anche il tuo vettore. (Nel tuo primo esempio, clear()
non garantisce di compattare il tuo vettore.)
Bene, completiamo 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));
Nessuno dei frammenti di codice che hai pubblicato fa alcun deallocazione di memoria, quindi sono approssimativamente uguali.
Il trucco di scambio che tutti gli altri continuano a pubblicare richiederà più tempo per essere eseguito, poiché dislocerà la memoria originariamente utilizzata dal vettore. Questo può o meno essere desiderabile.