Kopieren std :: vector: bevorzugen Sie die Zuordnung oder std :: copy?
Ich habe zwei Vektoren:
std::vector<int> v1, v2;
//Filling v1
...
Und jetzt muss ich kopieren v1
zu v2
. Gibt es irgendeinen Grund zu bevorzugen
v2 = v1;
zu
std::copy (v1.begin(), v1.end(), v2.begin());
(oder Umgekehrt)?
InformationsquelleAutor der Frage Violet Giraffe | 2013-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Generell würde ich stark bevorzugen
v2 = v1
:std::copy
wird nicht funktionieren, wennv2
hat nicht die gleiche Länge wiev1
(es wird nicht die Größe ändern, so behält es einige der alten Elemente im besten Fall (v2.size() > v1.size()
zu überschreiben und einige zufällige Daten, die anderswo im Programm schlimmsten Fallv1
abgelaufen ist (und Sie verwenden C++11) können Sie leicht ändern Sie es zumove
den Inhaltstd::copy
da die Entwickler wahrscheinlichstd::copy
intern, wenn es gab keinen performance-Vorteil.Abschließend
std::copy
ist weniger ausdrucksstark, könnte das falsche tun und ist auch gar nicht schneller. So gibt es nicht wirklich einen Grund, um es hier zu verwenden.InformationsquelleAutor der Antwort Grizzly
Den Aufruf
std::copy
können versuchen, Zugriff auf Elemente über das Ende der Ziel-Vektor.Zuordnung verwenden.
Es ist nicht deine Aufgabe, die Mikro-Optimierung: das ist die Bibliothek des Verfassers Verantwortung, und letztlich ist der compiler verantwortlich.
Können Sie Ihren code schnell beliebigwenn es nicht korrekt zu sein.
Im Fall der
copy
jedoch ist es eher zweifelhaft, ob es noch schneller ist, und es ist sicherlich nicht korrekt für den Allgemeinen Fall.InformationsquelleAutor der Antwort Cheers and hth. - Alf
Wenn
v2
nicht groß genug ist, bekommst du es zu einem Pufferüberlauf, wenn Siecopy
wie Sie Sie haben.Können Sie ein back-insert-iterator aufgerufen push_back auf
v2
. Jedoch kann dies führen zu mehreren Umschichtungen je nach dem, wie großv1
ist.Du bist besser dran lassen
vector
verwalten, die Dinge richtig. Der Zuweisungsoperator nicht diese, wievector::assign
:Habe ich eine Ahnung, dass der Zuweisungs-operator implementiert ist, in Bezug auf
vector::assign
.InformationsquelleAutor der Antwort Peter Wood
Kürzer.
std::copy
ist vor allem gedacht für das kopieren von Abschnitten von Containern. Wenn Sie müssen kopieren Sie einen ganzen container, Sie könnte genauso gut verwenden Sie die copy-Konstruktor.InformationsquelleAutor der Antwort Symaxion
Zuweisung, bei weitem. Mehr im Allgemeinen, zu jeder Zeit die Größe des Vektors könnte sich ändern, oder ändern Sie den gesamten Inhalt des Vektors, sollten Sie lieber member-Funktionen. Die einzige Zeit, die
std::copy
angemessen wäre, ist, wenn Sie nur das ersetzen einer kleinen Auswahl ganz in den Vektor.InformationsquelleAutor der Antwort James Kanze
Ausgangsbelegung ist klarer und intern verwendet
std::copy
(oderunitizalized_copy
_M_allocate_and_copy
je nach Größe und Kapazität) oder so Leistungen sind die gleichen.InformationsquelleAutor der Antwort FredericS