std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: emplace
|
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) |