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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top