Heim >Backend-Entwicklung >C++ >Push_back vs. Emplace_back: Wann sollten Sie beide in C verwenden?
Push_back vs Emplace_back: Eine tiefere Analyse
Einführung
Die Unterscheidung zwischen push_back und emplace_back Operationen in C sorgen oft für Verwirrung. Beide Funktionen werden zum Einfügen von Elementen in einen Container verwendet, unterscheiden sich jedoch in ihrem Verhalten, insbesondere bei der Arbeit mit R-Wert-Referenzen.
Push_back verstehen
push_back hat drei Überladungen: Einer nimmt einen konstanten Wert, einer nimmt eine R-Wert-Referenz und ein anderer nimmt eine unterschiedliche Anzahl von Argumenten an (ab C 11). Im Kontext von R-Wert-Referenzen verhält sich push_back(Type&& _Val) wie erwartet: Es fügt die R-Wert-Referenz direkt in den Container ein, ohne eine Kopie zu erstellen.
Entstehen von Emplace_back
Microsoft Visual C (MSVC) hat eine scheinbar redundante Version von emplace_back eingeführt, die eine Zeit lang dauert R-Wert-Referenz: emplace_back(Type&& _Val). Diese Überladung ist redundant, da sie funktional äquivalent zu push_back(Type&& _Val) ist, wenn sie mit einer R-Wert-Referenz verwendet wird.
Die wahre Kraft von Emplace_back
Das Wahre Das Potenzial von emplace_back liegt in seiner variablen Überladung: emplace_back(Args&&...). Im Gegensatz zu push_back ermöglicht diese Überladung die direkte Konstruktion von Objekten innerhalb eines Containers mithilfe weitergeleiteter Argumente. Dadurch entfällt die Notwendigkeit, temporäre Objekte zu erstellen und die Möglichkeit eines unnötigen Kopierens.
Wann Emplace_back zu verwenden ist
emplace_back ist besonders nützlich in Situationen, in denen das Erstellen temporärer Objekte erhebliche Kosten verursachen würde Overhead. Zum Beispiel beim Einfügen eines komplexen Objekts in eine Standardkarte:
std::map<int, Complicated> m; int anInt = 4; double aDouble = 5.0; std::string aString = "C++"; // Avoids creating temporary objects m.emplace(4, anInt, aDouble, aString);
Teilweise Implementierung von MSVC
Trotz der Einführung einer nicht standardmäßigen emplace_back-Überladung für R-Wert-Referenzen, MSVC hat die vollständige Variadic-Version noch nicht implementiert. Der Grund dafür ist die fehlende Unterstützung verschiedener Vorlagen in Visual C 10 zu diesem Zeitpunkt.
Das obige ist der detaillierte Inhalt vonPush_back vs. Emplace_back: Wann sollten Sie beide in C verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!