2008-10-06 4 views
5

Als Funktionsargument erhalte ich einen vector<double>& vec (ein Ausgangsvektor, also nicht-const) mit unbekannter Länge und Werten. Ich möchte diesen Vektor auf eine bestimmte Länge n mit allen Nullen initialisieren.(re) initialisiere einen Vektor auf eine bestimmte Länge mit Anfangswerten

wird diese

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

Und dies auch funktioniert:

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

die zweite effizienter ist (weil kein Speicherfreigabe/Zuteilung beteiligt ist)? Gibt es einen effizienteren Weg, dies zu tun?

Antwort

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

Nach diesem vec garantiert Größe und Kapazität n haben, mit allen Werten 0.0.

Die vielleicht mehr idiomatische Weg seit 11 C++ ist

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

mit der zweiten Zeile optional. In dem Fall, in dem vec mit mehr als n Elementen beginnt, ist es eine Abwägung, ob zwischen shrink_to_fit gerufen wird, mehr Speicher zu speichern, als für die Durchführung einer Neuzuweisung erforderlich ist.

+0

Danke für deine Korrektur --- Ich habe auch meinen Eintrag aktualisiert. :-) –

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

Dies hat den Vorteil, dass Sie Ihren Vektor auch verdichten. (In Ihrem ersten Beispiel hat clear() nicht garantiert Ihren Vektor zu verdichten.)

+0

Sie könnten diese Größe ändern() auch nicht die Vektorkapazität verkleinern. –

+0

Stimmt, das habe ich für selbstverständlich gehalten (da ich clear() als Sonderfall von resize() sehe). :-) –

+0

Dies ist nicht-Standard-C++ - Swap nimmt eine nicht-const Referenz, die nicht an den temporären Vektor binden wird. Visual C++ ermöglicht dies als eine Sprachenerweiterung. –

3

Nun lassen Sie uns die Möglichkeiten runden das :)

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

Die letzten beiden haben nicht den gewünschten Effekt, zumindest unter der Standard-Implementierung von std :: swap. :-) –

+1

Eigentlich tut es :) std :: swap ist in Vektor überladen und ruft die Member-Funktion auf. Dies wird vom Standard gefordert. –

2

keiner der Code-Schnipsel, dass Sie jede Speicherfreigabe tun geschrieben zu tun, so dass sie in etwa gleich.

Der Swap-Trick, den alle anderen veröffentlichen, dauert länger, weil er den ursprünglich vom Vektor verwendeten Speicher freigibt. Dies kann oder kann nicht wünschenswert sein.