(Re) initialisiert einen Vektor auf eine bestimmte Länge mit den Anfangswerten
-
05-07-2019 - |
Frage
Als Funktionsargument erhalte ich einen vector<double>& vec
(einen Ausgangsvektor, also nicht-const) mit unbekannter Länge und Werten. Ich möchte mit allen Nullen diesen Vektor auf eine bestimmte Länge n initialisieren.
Dies funktioniert
vec.clear();
vec.resize( n, 0.0 );
Und das funktioniert auch:
vec.resize( n );
vec.assign( n, 0.0 );
Ist die zweite effiziente (da keine Speicherfreigabe / Zuteilung beteiligt ist)? Gibt es eine effizientere Art und Weise, dies zu tun?
Lösung
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, da C ++ 11
vec.assign(n, 0.);
vec.shrink_to_fit();
mit der zweiten Zeile optional. In dem Fall, wo vec
mit mehr als n
Elementen beginnt, ob shrink_to_fit
zu nennen, ist ein Kompromiss auf mehr Speicher zwischen Halt als vs Durchführung eine Neuzuweisung erforderlich ist.
Andere Tipps
std::vector<double>(n).swap(vec);
Dies hat den Vorteil, tatsächlich Ihren Vektor zu verdichten. (In Ihrem ersten Beispiel clear()
garantiert nicht Ihren Vektor zu verdichten.)
Nun wollen wir die Möglichkeiten abzurunden, dies zu tun:)
vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
Keine der Code-Schnipsel, dass Sie jede Speicherfreigabe tun geschrieben, so dass sie in etwa gleich.
Der Swap-Trick, dass alle anderen Posting länger auszuführen nehmen hält, weil sie den Speicher ursprünglich durch den Vektor verwendet wird ausplanen. Dies kann oder kann nicht wünschenswert sein.