Push_back vs Emplace_back: A Deeper Analysis
Introduction
The distinction between push_back and emplace_back operations in C is often a source of confusion. Both functions are used to insert elements into a container, but they differ in their behavior, especially when working with rvalue references.
Understanding Push_back
push_back has three overloads: one taking a const value, one taking an rvalue reference, and another that takes a variadic number of arguments (C 11 onwards). In the context of rvalue references, push_back(Type&& _Val) behaves as expected: it directly inserts the rvalue reference into the container without creating a copy.
Emergence of Emplace_back
Microsoft Visual C (MSVC) introduced a seemingly redundant version of emplace_back that takes an rvalue reference: emplace_back(Type&& _Val). This overload is redundant because it is functionally equivalent to push_back(Type&& _Val) when used with an rvalue reference.
The True Power of Emplace_back
The true potential of emplace_back lies in its variadic overload: emplace_back(Args&&...). Unlike push_back, this overload allows for direct construction of objects within a container using forwarded arguments. This eliminates the need for creating temporary objects and the potential for unnecessary copying.
When to Use Emplace_back
emplace_back is particularly useful in situations where creating temporary objects would incur significant overhead. For instance, when inserting a complex object into a standard map:
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);
MSVC's Partial Implementation
Despite introducing a non-standard emplace_back overload for rvalue references, MSVC has not yet implemented the full variadic version. The reason behind this is the lack of variadic template support in Visual C 10 at the time.
The above is the detailed content of Push_back vs. Emplace_back: When Should You Use Each in C ?. For more information, please follow other related articles on the PHP Chinese website!