C ++ konvertiert den Vektor <int> in den Vektor <double>

93

Was ist ein guter sauberer Weg, um ein std::vector<int> intVeczu konvertieren std::vector<double> doubleVec. Oder allgemeiner, um zwei Vektoren konvertierbarer Typen zu konvertieren?

Alan Turing
quelle

Antworten:

164

Verwenden Sie std::vectorden Bereichskonstruktor:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());
James McNellis
quelle
Könnten Sie dann also auch die std::copy(...)Funktion nutzen? Könnten Sie das der Antwort hinzufügen?
Alan Turing
3
@ Lex: copy(v_int.begin(), v_int.end(), back_inserter(v_float));oderv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy
1
Eine schlechte Idee, da die Konstruktorversion den Vektor anhand der Iteratorkategorie dimensioniert, um festzustellen, dass es sich um Iteratoren mit wahlfreiem Zugriff handelt und dann genügend Speicherplatz reserviert wird. Das Ändern der Größe vor dem Kopieren ist eine verschwenderische Nullinitialisierung.
Michael Goldshteyn
1
@MichaelGoldshteyn Ich verstehe nicht - wenn Sie die Größe nicht vorher angeben, wird die Größe automatisch geändert, wenn die Kapazität überschritten wird (wodurch alle Elemente immer wieder kopiert werden). Okay, dies ist eine amortisierte lineare Zeit, aber ich wette, das ist immer noch viel langsamer als eine einzelne 0-Initialisierung. Vermisse ich etwas an deiner Argumentation?
Algoman
1
@Algoman siehe std::distance()"Wenn es sich um einen Iterator mit wahlfreiem Zugriff handelt, verwendet die Funktion den Operator-, um dies zu berechnen. Andernfalls verwendet die Funktion den Erhöhungsoperator (Operator ++) wiederholt." In diesem Fall könnte die Anzahl der Elemente durch Subtrahieren der Iteratoren ermittelt werden. Ob die Standardbibliothek implementiert ist, um std :: distance für eine anfängliche Reserve () zu verwenden, ist eine andere Frage, aber godbolt.org/z/6mcUFh enthält zumindest einen Aufruf von std :: distance ().
user1556435