std::list::emplace_back(3)

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

std::list::emplace_back(3) πŸ’…

okay so bestie, welcome to the C++ Standard Library page for std::list::emplace_back β€” yes it's a mouthful, yes it's iconic, and yes we're gonna get through it together 🫢


✨ NAME ✨

std::list::emplace_back β€” literally the function you call when you want a brand-new element to appear at the end of your list, built right there, no extra copies, no drama πŸ’…


🌸 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 );

So here's the tea: it 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)....

No iterators or references are invalidated. Not one. She said "I'm not touching your pointers, bestie" and honestly? Respect 😌


πŸŽ€ Parameters πŸŽ€

  • args β€” the arguments you're forwarding to the constructor of the element. they get yeeted straight into the constructor, iykyk

πŸ’œ Type requirements πŸ’œ

  • T (the container's element type) must meet the requirements of EmplaceConstructible. that's the vibe check it has to pass, no cap

πŸ¦‹ Return value πŸ¦‹

  • (none) β€” until C++17 girlie gave you nothing back 😭
  • A reference to the inserted element. β€” since C++17 and now she's serving main character energy, handing you a reference like it's a gift 🎁

⭐ Complexity ⭐

Constant. fr fr, that's it. constant. slay ✨


πŸ”₯ Exceptions πŸ”₯

If an exception is thrown, this function has no effect β€” that's the strong exception guarantee. so like, if things go sideways, she rolls back the whole thing and pretends it never happened πŸ™ˆ iconic behaviour honestly


πŸ’– Example πŸ’–

okay so this code uses emplace_back to append an object of type President to a std::list. 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. like, watch the output β€” you'll see it πŸ‘€

// Run this code

#include <list>
#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::list<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::list<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 that? emplace_back gave you one line, push_back gave you two. the move constructor said "not today" πŸ’€ that's the whole point bestie ✨


🌈 See also 🌈

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

lowkey the moral of the story: emplace_back builds it in place at the end of the container, forwards your args, invalidates nothing, and keeps its promises even when exceptions show up. periodt πŸ’…

and that's the whole page, bestie πŸŽ€βœ¨ this one came from http://cppreference.com, dated 2024.06.10, and yes the page itself is std::list::emplace_back(3) β€” mwah, go forth and emplace πŸ«ΆπŸ’–

πŸ“¦ where this page comes from