Namespaces
Variants

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: emplace

From cppreference.net

template < class ... Args >
std:: pair < iterator, bool > emplace ( Args && ... args ) ;
(начиная с C++23)
(constexpr начиная с C++26)

Вставляет новый элемент в контейнер, созданный на месте с заданными args , если в контейнере отсутствует элемент с таким ключом.

Инициализирует объект t типа std:: pair < key_type, mapped_type > с помощью std:: forward < Args > ( args ) ... ; если отображение уже содержит элемент, чей ключ эквивалентен t. first , * this остаётся без изменений. В противном случае эквивалентно:

auto key_it = ranges::upper_bound(c.keys, t.first, compare);
auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it);
c.keys.insert(key_it, std::move(t.first));
c.values.insert(value_it, std::move(t.second));

Эта перегрузка участвует в разрешении перегрузки только если std:: is_constructible_v < std:: pair < key_type, mapped_type > , Args... > равно true .

Если value_type не является EmplaceConstructible в flat_map из args , поведение не определено.

Содержание

Параметры

args - аргументы для передачи конструктору элемента

Возвращаемое значение

Пара, состоящая из итератора на вставленный элемент (или на элемент, который предотвратил вставку) и значения bool установленного в true тогда и только тогда, когда вставка произошла.

Исключения

Если по какой-либо причине возникает исключение, эта функция не оказывает никакого эффекта ( гарантия строгой безопасности исключений ).

Сложность

Если происходит вставка, линейно по размеру контейнера, в противном случае логарифмически по размеру контейнера

Примечания

Аккуратное использование emplace позволяет создавать новый элемент, избегая ненужных операций копирования или перемещения.

Пример

#include <iostream>
#include <string>
#include <utility>
#include <flat_map>
int main()
{
    std::flat_map<std::string, std::string> m;
    // использует конструктор перемещения pair
    m.emplace(std::make_pair(std::string("a"), std::string("a")));
    // использует преобразующий конструктор перемещения pair
    m.emplace(std::make_pair("b", "abcd"));
    // использует шаблонный конструктор pair
    m.emplace("d", "ddd");
    // emplace с дублирующимся ключом не имеет эффекта
    m.emplace("d", "DDD");
    // использует поэлементный конструктор pair
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple("c"),
              std::forward_as_tuple(10, 'c'));
    // альтернатива: m.try_emplace("c", 10, 'c');
    for (const auto& p : m)
        std::cout << p.first << " => " << p.second << '\n';
}

Вывод:

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

Смотрите также

создаёт элементы на месте с использованием подсказки
(public member function)
вставляет на месте, если ключ не существует, не делает ничего, если ключ существует
(public member function)
вставляет элементы
(public member function)