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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top