std::map::emplace(3)

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

🌸 NAME 🌸

std::map::emplace - std::map::emplace (yes bestie, that’s the whole NAME section β€” iconic minimalism ✨).

✨ Synopsis ✨

okay so here’s the signature, bestie:

template< class... Args >
std::pair<iterator, bool> emplace( Args&&... args );

since C++11 β€” we’ve been blessed since C++11 πŸ’….

So what does it actually do? Inserts a new element into the container constructed in-place with the given args, if there is no element with the key in the container. ✨

The constructor of the new element (i.e. std::pair<const Key, T>) is called with exactly the same arguments as supplied to emplace, forwarded via std::forward<Args>(args).... And listen: the element may be constructed even if there already is an element with the key in the container, in which case that newly constructed element will be destroyed immediately. 😭 Construction then instant destruction, we hate to see it, but that’s the rule.

Careful use of emplace allows the new element to be constructed while avoiding unnecessary copy or move operations. Highkey the whole reason to use it, bestie.

No iterators or references are invalidated. Iconic, stable, we love.

πŸ’– Parameters πŸ’–

  • args β€” arguments to forward to the constructor of the element.

πŸŽ€ Return value πŸŽ€

A pair consisting of an iterator to the inserted element (or to the element that prevented the insertion) and a bool value set to true if and only if the insertion took place. So you get the β€œwhere” and the β€œdid it happen” in one cute little bundle πŸŽ€.

🚨 Exceptions 🚨

If an exception is thrown for any reason, this function has no effect β€” that’s the strong exception safety guarantee πŸ’ͺ. No half-done glow-up, bestie.

⏱️ Complexity ⏱️

Logarithmic in the size of the container.

🌈 Example 🌈

// Run this code

#include <iostream>
#include <string>
#include <utility>
#include <map>

int main()
{
    std::map<std::string, std::string> m;

    // uses pair's move constructor
    m.emplace(std::make_pair(std::string("a"), std::string("a")));

    // uses pair's converting move constructor
    m.emplace(std::make_pair("b", "abcd"));

    // uses pair's template constructor
    m.emplace("d", "ddd");

    // emplace with duplicate key has no effect
    m.emplace("d", "DDD");

    // uses pair's piecewise constructor
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple("c"),
              std::forward_as_tuple(10, 'c'));
    // an alternative is: m.try_emplace("c", 10, 'c');

    for (const auto& p : m)
        std::cout << p.first << " => " << p.second << '\n';
}

✨ Output ✨

a => a
b => abcd
c => cccccccccc
d => ddd

πŸ‘€ See also πŸ‘€

  • emplace_hint β€” constructs elements in-place using a hint (C++11) (public member function).
  • try_emplace β€” inserts in-place if the key does not exist, does nothing if the key exists (C++17) (public member function).
  • insert β€” inserts elements or nodes (since C++17) (public member function).

source/version + date check: http://cppreference.com Β· 2024.06.10 Β· page std::map::emplace(3) β€” that’s the footer, bestie. byeee πŸ«ΆπŸ’–

πŸ“¦ where this page comes from