Heim >Backend-Entwicklung >C++ >Push_back vs. Emplace_back: Wann sollten Sie beide in C verwenden?

Push_back vs. Emplace_back: Wann sollten Sie beide in C verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-23 09:47:29717Durchsuche

Push_back vs. Emplace_back: When Should You Use Each in C  ?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn