< cpp‎ | container‎ | vector
Revision as of 17:44, 2 November 2012 by P12bot (Talk | contribs)

template< class... Args >
void emplace_back( Args&&... args );
(since C++11)

Appends a new element to the end of the container. The element is constructed through std::allocator_traits::construct, which typically uses placement-new to construct the element in-place at the location provided by the container. The arguments args... are forwarded to the constructor as std::forward<Args>(args)....

If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated.



args - arguments to forward to the constructor of the element
Type requirements
T (the container's element type) must meet the requirements of MoveInsertable and EmplaceConstructible.

Return value





If an exception is thrown, this function has no effect (strong exception guarantee). If T's move constructor is not noexcept and is not CopyInsertable into *this, vector will use the throwing move constructor. If it throws, the guarantee is waived and the effects are unspecified.


The specialization std::vector<bool> did not have emplace_back() member until C++14.


The following code uses emplace_back to append an object of type President to a std::vector. It demonstrates how emplace_back forwards parameters to the President constructor and shows how using emplace_back avoids the extra copy or move operation required when using push_back.

#include <vector>
#include <string>
#include <iostream>
struct President
    std::string name;
    std::string country;
    int year;
    President(std::string p_name, std::string p_country, int p_year)
        : name(std::move(p_name)), country(std::move(p_country)), year(p_year)
        std::cout << "I am being constructed.\n";
    President(President&& other)
        : name(std::move(, country(std::move(, year(other.year)
        std::cout << "I am being moved.\n";
    President& operator=(const President& other) = default;
int main()
    std::vector<President> elections;
    std::cout << "emplace_back:\n";
    elections.emplace_back("Nelson Mandela", "South Africa", 1994);
    std::vector<President> reElections;
    std::cout << "\npush_back:\n";
    reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));
    std::cout << "\nContents:\n";
    for (President const& president: elections) {
        std::cout << << " was elected president of "
                  << << " in " << president.year << ".\n";
    for (President const& president: reElections) {
        std::cout << << " was re-elected president of "
                  << << " in " << president.year << ".\n";


I am being constructed.
I am being constructed.
I am being moved.
Nelson Mandela was elected president of South Africa in 1994.
Franklin Delano Roosevelt was re-elected president of the USA in 1936.

See also

adds an element to the end
(public member function) [edit]