# std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::emplace

From cppreference.com
< cpp‎ | container‎ | unordered map

template< class... Args > std::pair<iterator, bool> emplace( Args&&... args ); |  | (since C++11)

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).... The element may be constructed even if there already is an element with the key in the container, in which case the newly constructed element will be destroyed immediately (see `try_emplace()` if this behavior is undesirable).

Careful use of `emplace` allows the new element to be constructed while avoiding unnecessary copy or move operations.

If after the operation the new number of elements is greater than old `max_load_factor()``*``` `bucket_count()` a rehashing takes place.
If rehashing occurs (due to the insertion), all iterators are invalidated. Otherwise (no rehashing), iterators are not invalidated.

### 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.

### Exceptions

If an exception is thrown for any reason, this function has no effect (strong exception safety guarantee).

### Complexity

Amortized constant on average, worst case linear in the size of the container.

### Example

Run this code

    #include <iostream>
    #include <string>
    #include <utility>
    #include <unordered_map>

    int main()
    {
        std::unordered_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';
    }

Possible output:

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

### See also

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

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/container/unordered_map/emplace&oldid=136034"