C++ std::string Anhängen vs push_back()
Dies ist wirklich eine Frage nur für mein eigenes Interesse, ich habe nicht in der Lage zu bestimmen, durch die Dokumentation.
Sehe ich auf http://www.cplusplus.com/reference/string/string/ anfügen, hat die Komplexität:
"Ein unbekannter, aber in der Regel bis zu linearen in das neue string-Länge."
während push_back() Komplexität:
"Unspezifiziert; in der Regel amortisiert konstant, aber linear in den neuen string-Länge."
Als Spielzeug angenommen, ich wollte die Zeichen anfügen "foo" in einen string. Würde
myString.push_back('f');
myString.push_back('o');
myString.push_back('o');
und
myString.append("foo");
Menge zu genau der gleichen Sache? Oder gibt es da einen Unterschied? Sie könnten herausfinden, dass append wäre effizienter, weil der compiler wissen, wie viel Speicher erforderlich ist, um verlängern die Zeichenfolge die angegebene Anzahl von Zeichen, während push_back können, müssen sichere Speicher pro Aufruf?
InformationsquelleAutor der Frage Memento Mori | 2013-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++03 (für die die meisten "cplusplus.com"'s Dokumentation geschrieben ist), der Komplexität wurden nicht angegeben, da library-Entwickler dürfen Copy-On-Write" oder "Seil-Stil" interne Repräsentationen für Streicher. Zum Beispiel, eine KUH, die die Umsetzung möglicherweise benötigen, kopieren Sie die gesamte Zeichenfolge, wenn ein Charakter wird verändert und es wird gemeinsam Los.
In C++11 -, KUH-und Seil-Implementierungen sind verboten. Sie sollten erwarten, konstant fortgeführten Zeit pro Zeichen Hinzugefügt oder linear amortisiert Zeit, in der die Anzahl der Zeichen Hinzugefügt, zum Anhängen an einen string am Ende. Praktiker können noch relativ verrückte Sachen mit strings (im Vergleich zu, sagen
std::vector
), aber die meisten Implementierungen begrenzt, um Dinge wie den "small string optimization".Im Vergleich
push_back
undappend
push_back
nimmt die zugrunde liegende Implementierung potentiell nützliche Informationen wie der Kabellänge, die Sie es verwenden könnte, um preallocate Raum. Auf der anderen Seiteappend
erfordert, dass eine Umsetzung zu Fuss über die Eingabe zweimal, um zu finden, die Länge, so dass der performance-Gewinn oder Verlust ist hängt von einer Reihe unberechenbarer Faktoren wie die Länge der Zeichenfolge, bevor Sie die append. Das heißt, der Unterschied ist wohl extrem extrem Extrem klein. Gehen Sie mitappend
für diese-es ist weit mehr lesbar.InformationsquelleAutor der Antwort Billy ONeal
Fügen Sie eine weitere Meinung hier.
Ich persönlich halte es für besser, verwenden
push_back()
beim hinzufügen von Zeichen aus einem anderen string. Zum Beispiel:Wenn mit
append()
hier würde ich ersetzenpush_back(it)
mitappend(1,it)
nicht lesbar für mich.InformationsquelleAutor der Antwort Pei
Ich hatte die gleichen Zweifel, also habe ich einen kleinen test, um diese zu überprüfen (g++ 4.8.5 mit C++11 Profil auf Linux, Intel, 64 bit unter VmWare Fusion).
Und das Ergebnis ist interessant:
Möglich sein könnte, das ist, weil die Länge der Zeichenfolge (groß), aber der operator + ist sehr teuer im Vergleich mit der push_back und die append.
Es ist auch interessant, dass, wenn der Betreiber erhält nur ein Zeichen (keine Zeichenkette), es verhält sich sehr ähnlich wie die push_back.
Nicht davon abhängen, pre-allokierten Variablen, wobei jeder Zyklus ist definiert in einem anderen Bereich.
Hinweis : die vCounter einfach verwendet gettimeofday, die Unterschiede zu vergleichen.
InformationsquelleAutor der Antwort user2583872
Ja, ich würde auch erwarten, dass
append()
besser für die Gründe, die Sie gab, und in einer situation, wo Sie brauchen, um eine Zeichenfolge angefügt, mitappend()
(oderoperator+=
) ist sicherlich vorzuziehen (nicht zuletzt auch deshalb, weil der code sehr viel besser lesbar).Aber, was der Standard angibt, ist die Komplexität der Bedienung. Und das ist in der Regel linear, auch für
append()
weil letztlich jedes Zeichen der Zeichenfolge angehängt wird (und möglichst alle Zeichen, wenn Umverteilung stattfindet) kopiert werden muss (dies gilt auch, wennmemcpy
oder ähnliches verwendet werden).InformationsquelleAutor der Antwort jogojapan