Namespaces
Variants

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

From cppreference.net

template < class ... Args >
iterator 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_multimap из args , поведение не определено.

Содержание

Параметры

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

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

Итератор на вставленный элемент.

Исключения

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

Сложность

Линейно по размеру контейнера

Примечания

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

Пример

#include <iostream>
#include <string>
#include <utility>
#include <flat_map>
int main()
{
    std::flat_multimap<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'));
    for (const auto& p : m)
        std::cout << p.first << " => " << p.second << '\n';
}

Вывод:

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

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

создаёт элементы на месте с использованием подсказки
(публичная функция-член)
вставляет элементы
(публичная функция-член)