webentwicklung-frage-antwort-db.com.de

schnelle Möglichkeit, einen Vektor in einen anderen zu kopieren

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?

135
Sasha

Ihr zweites Beispiel funktioniert nicht, wenn Sie das Argument als Referenz senden. Hast du gemeint

void copyVecFast(vec<int> original) // no reference
{

  vector<int> new_;
  new_.swap(original); 
}

Das würde funktionieren, ist aber einfacher

vector<int> new_(original);
109
rlbond

Sie sind aber nicht gleich, oder? Einer ist eine Kopie, der andere ist ein Tausch. Daher die Funktionsnamen.

Mein Favorit ist:

a = b;

Dabei sind a und b Vektoren.

225

Dies ist eine weitere gültige Methode, um eine Kopie eines Vektors zu erstellen. Verwenden Sie einfach seinen Konstruktor:

std::vector<int> newvector(oldvector);

Dies ist noch einfacher als die Verwendung von std::copy, Um den gesamten Vektor von Anfang bis Ende zu durchlaufen und std::back_insert In den neuen Vektor zu verschieben.

Abgesehen davon 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.

66
X-Istence

sie sollten Swap nicht zum Kopieren von Vektoren verwenden, da dies den "ursprünglichen" Vektor verändern würde.

übergeben Sie stattdessen das Original als Parameter an das Neue.

14
Raz
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
12
FaridLU

Direkte Antwort:

  • Benutze einen = Operator

Wir können die öffentliche Mitgliederfunktion std::vector::operator= des Containers std::vector zum Zuweisen von Werten von einem Vektor zu einem anderen.

  • Verwenden Sie eine Konstruktorfunktion

Dabei ist auch eine Konstruktorfunktion sinnvoll. Eine Konstruktorfunktion mit einem anderen Vektor als Parameter (z. B. x) erstellt einen Container mit einer Kopie aller Elemente in x in derselben Reihenfolge.

Vorsicht:

  • Verwende nicht std::vector::swap

std::vector::swap ist nicht Kopieren ein Vektor zu einem anderen, es tauscht tatsächlich Elemente von zwei Vektoren, genau wie sein Name schlägt vor. Mit anderen Worten, der zu kopierende Quellvektor wird nach std::vector::swap heißt, was wahrscheinlich nicht das ist, was man erwartet.

  • Tiefe oder flache Kopie?

Wenn die Elemente im Quellvektor Zeiger auf andere Daten sind, wird manchmal eine tiefe Kopie gewünscht.

Laut Wikipedia:

Eine tiefe Kopie, dh Felder werden dereferenziert: Anstatt auf zu kopierende Objekte zu verweisen, werden für alle Objekte, auf die verwiesen wird, neue Kopierobjekte erstellt, und Verweise auf diese werden in B platziert.

Tatsächlich gibt es derzeit in C++ keine integrierte Möglichkeit, eine tiefe Kopie zu erstellen. Alle oben genannten Möglichkeiten sind flach. Wenn eine tiefe Kopie erforderlich ist, können Sie einen Vektor durchqueren und manuell eine Kopie der Referenzen erstellen. Alternativ kann ein Iterator zum Durchlaufen in Betracht gezogen werden. Die Diskussion über den Iterator steht außer Frage.

Verweise

Die Seite von std::vector auf cplusplus.com

10
Jerry Yang