std::vector::emplace_back(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::vector::emplace_back(3) πŸ’–

okay so bestie, this lil icon is straight from the C++ Standard Library manual, and it's genuinely one of those β€œtiny function, huge glow-up” situations. It's giving β€œappend but make it constructor-forwarding.” πŸ’…


🌸 NAME 🌸

std::vector::emplace_back β€” literally std::vector::emplace_back. That's the name, that's the vibe. ✨


✨ Synopsis ✨

template< class... Args >                  (since C++11)
void emplace_back( Args&&... args );       (until C++17)
template< class... Args >                  (since C++17)
reference emplace_back( Args&&... args );  (constexpr since C++20)

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 after the operation the new size() is greater than old capacity() a reallocation takes place, in which case all iterators (including the end() iterator) and all references to the elements are invalidated. Otherwise only the end() iterator is invalidated.

bestie, clock the invalidation tea: reallocation = all iterators and references get cooked. no reallocation = only end() gets invalidated. 🫢

πŸŽ€ Parameters πŸŽ€

  • 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 πŸ’–

  • (none) β€” until C++17.
  • A reference to the inserted element. β€” since C++17.

🌈 Complexity 🌈

Amortized constant. ⭐


😭 Exceptions 😭

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.

not the β€œwaived guarantee, unspecified effects” combo being lowkey scary. stay safe out there. πŸ’€

πŸ“ Notes πŸ“

Since reallocation may take place, emplace_back requires the element type to be MoveInsertable for vectors.


πŸ‘‘ Example πŸ‘‘

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.

// Run this code

#include <vector>
#include <cassert>
#include <iostream>
#include <string>

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";
    auto& ref = elections.emplace_back("Nelson Mandela", "South Africa", 1994);
    assert(ref.year == 1994 && "uses a reference to the created object (C++17)");

    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 << president.name << " was elected president of "
                  << president.country << " in " << president.year << ".\n";

    for (President const& 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.

πŸ”Ž See also πŸ”Ž

  • push_back adds an element to the end (public member function).
  • emplace constructs element in-place (C++11) (public member function).

That's the whole manual page, bestie β€” source: http://cppreference.com, version date: 2024.06.10. periodt. πŸ’…βœ¨πŸŽ€

πŸ“¦ where this page comes from