Namespaces
Variants
Views
Actions

std::vector::emplace_back

From cppreference.com
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 in-place, i.e. no copy or move operations are performed. The constructor of the element is called with exactly the same arguments, as supplied to the function.

If new size() is not larger than capacity(), no iterators or references are invalidated. Otherwise all iterators and references are invalidated.

Contents

[edit] Parameters

args - arguments to forward to the constructor of the element

[edit] Return value

(none)

[edit] Complexity

Constant.

[edit] Example

The following code uses emplace_back to add an element to a std::vector of an arbitrary class (President). It uses the parameters of President constructor. It also shows how using emplace_back saves 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(other.name)), country(std::move(other.country)), 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 & president: elections)
  {
    std::cout << president.name << " was elected president of "
      << president.country << " in " << president.year << ".\n";
  }
  for (President & president: reElections)
  {
    std::cout << president.name << " was re-elected president of "
      << president.country << " in " << president.year << ".\n";
  }
}

Output:

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

[edit] See also

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