Ich bevorzuge zwei Möglichkeiten:
void copyVecFast(const vec<int>& original)
{
vector<int> newVec;
newVec.reserve(original.size());
copy(original.begin(),original.end(),back_inserter(newVec));
}
void copyVecFast(vec<int>& original)
{
vector<int> newVec;
newVec.swap(original);
}
Wie machst du das?
Antworten:
Ihr zweites Beispiel funktioniert nicht, wenn Sie das Argument als Referenz senden. Meintest du
Das würde funktionieren, ist aber einfacher
quelle
original
ist eine Kopie des Funktionsarguments.Sie sind aber nicht die gleichen, oder? Einer ist eine Kopie, der andere ist ein Tausch . Daher die Funktionsnamen.
Mein Favorit ist:
Wo
a
undb
sind Vektoren.quelle
a = b
dann nein. Aufgabe bedeutet:a
Gleich machen,b
ohne sich zu ändernb
. Im Gegensatz dazustd::swap(a, b)
würden ihre Inhalte austauschen (sob
istsize
jetzt wäre , wasa
's vor gewesen war). Sie denken vielleicht an eine Verschiebungsoperation (wie sie in C ++ 11 vorkommt, aber nicht in einer gewöhnlichen Aufgabe wie dieser). Ein solcher Schritt würdeb
in einem, ähm, "interessanten" Zustand ablaufen&&
. Diese Version wird nur als Referenz verwendet. Es stimmt nicht mit einem nicht konstanten Wert überein (wieb
in meinem obigen Beispiel). Sie können sichb
in eine verwandeln, indem Sie sagen:a = std::move(b);
Siehe en.cppreference.com/w/cpp/language/value_category für noch mehr Komplexität.Dies ist eine weitere gültige Methode zum Erstellen einer Kopie eines Vektors. Verwenden Sie einfach dessen Konstruktor:
Dies ist noch einfacher, als
std::copy
den gesamten Vektor von Anfang bis Ende zu durchlaufenstd::back_insert
in den neuen Vektor zu verschieben.Davon abgesehen ist Ihre
.swap()
keine Kopie, sondern vertauscht die beiden Vektoren. Sie würden das Original so ändern, dass es nichts mehr enthält! Welches ist keine Kopie.quelle
Direkte Antwort:
=
OperatorWir können die public member-Funktion
std::vector::operator=
des Containers verwenden,std::vector
um Werte von einem Vektor einem anderen zuzuweisen.Außerdem ist eine Konstruktorfunktion sinnvoll. Eine Konstruktorfunktion mit einem anderen Vektor als Parameter (z. B.
x
) erstellt einen Container mit einer Kopie jedes der Elemente inx
derselben Reihenfolge.Vorsicht:
std::vector::swap
std::vector::swap
ist nicht das Kopieren eines Vektors zu einem anderen, ist es tatsächlich Elemente zweier Vektoren Swapping, wie der Name vermuten lässt. Mit anderen Worten, der Quellvektor, von dem kopiert werden soll, wird nach demstd::vector::swap
Aufruf geändert , was wahrscheinlich nicht das ist, was Sie erwarten.Wenn die Elemente im Quellvektor Zeiger auf andere Daten sind, ist manchmal eine tiefe Kopie erwünscht.
Laut Wikipedia:
Tatsächlich gibt es derzeit in C ++ keine integrierte Möglichkeit, eine tiefe Kopie zu erstellen. Alle oben genannten Wege sind flach. Wenn eine tiefe Kopie erforderlich ist, können Sie einen Vektor durchlaufen und die Referenzen manuell kopieren. Alternativ kann ein Iterator zum Durchlaufen in Betracht gezogen werden. Die Diskussion über den Iterator geht über diese Frage hinaus.
Verweise
Die Seite von
std::vector
auf cplusplus.comquelle
Sie sollten Swap nicht zum Kopieren von Vektoren verwenden, da dies den "ursprünglichen" Vektor ändern würde.
Übergeben Sie stattdessen das Original als Parameter an das Neue.
quelle
quelle
Falls der Vektor BEREITS vorhanden war und Sie nur kopieren wollten, können Sie Folgendes tun:
quelle
newVec = oldVec
was mit einer der anderen Antworten identisch ist.