std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::try_emplace
template< class... Args > std::pair<iterator, bool> try_emplace( const key_type& k, Args&&... args ); | (1) | (начиная с C++23) |
template< class... Args > std::pair<iterator, bool> try_emplace( key_type&& k, Args&&... args ); | (2) | (начиная с C++23) |
template< class K, class... Args > std::pair<iterator, bool> try_emplace( K&& k, Args&&... args ); | (3) | (начиная с C++23) |
template< class... Args > iterator try_emplace( const_iterator hint, const key_type& k, Args&&... args ); | (4) | (начиная с C++23) |
template< class... Args > iterator try_emplace( const_iterator hint, key_type&& k, Args&&... args ); | (5) | (начиная с C++23) |
template< class K, class... Args > iterator try_emplace( const_iterator hint, K&& k, Args&&... args ); | (6) | (начиная с C++23) |
Если в контейнере уже существует ключ, эквивалентный k, ничего не делает. В противном случае вставляет новый элемент во внутренние контейнеры c с ключом k и значением, сконструированным с помощью args.
auto key_it = ranges::upper_bound(c.keys, k, compare); auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it); c.keys.insert(key_it, std::forward<decltype(k)>(k)); c.values.emplace(value_it, std::forward<Args>(args)...);
auto key_it = ranges::upper_bound(c.keys, k, compare); auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it); c.keys.emplace(key_it, std::forward<K>(k)); c.values.emplace(value_it, std::forward<Args>(args)...);
k в key_type должно конструировать объект u, для которого find(k) == find(u) является true. В противном случае поведение не определено.- Квалифицированное имя
Compare::is_transparentдопустимо и обозначает тип. -
std::is_constructible_v<key_type, K>являетсяtrue. -
std::is_assignable_v<mapped_type&, Args...>являетсяtrue. - Только для (3),
std::is_convertible_v<K&&, const_iterator>иstd::is_convertible_v<K&&, iterator>являютсяfalse.
Параметры
| k | - | ключ, используемый для поиска и вставки, если он не найден |
| hint | - | итератор на позицию, перед которой будет вставлен новый элемент |
| args | - | аргументы, передаваемые конструктору элемента |
Возвращаемое значение
emplace.emplace_hint.Сложность
emplace.emplace_hint.Примечания
В отличие от insert или emplace, эти функции не перемещают аргументы-значения rvalue, если вставка не выполняется. Благодаря этому удобно работать с отображениями, значения которых относятся к типам, допускающим только перемещение, например std::flat_map<std::string,std::unique_ptr<foo>>. Кроме того, try_emplace обрабатывает ключ и аргументы для mapped_type отдельно, в отличие от emplace, которому нужны аргументы для конструирования value_type (то есть std::pair).
Перегрузки (3,6) можно вызвать, не конструируя объект типа key_type.
Пример
#include <flat_map>
#include <iostream>
#include <string>
#include <utility>
void print_node(const auto& node)
{
std::cout << '[' << node.first << "] = " << node.second << '\n';
}
void print_result(auto const& pair)
{
std::cout << (pair.second ? "inserted: " : "ignored: ");
print_node(*pair.first);
}
int main()
{
using namespace std::literals;
std::map<std::string, std::string> m;
print_result(m.try_emplace( "a", "a"s));
print_result(m.try_emplace( "b", "abcd"));
print_result(m.try_emplace( "c", 10, 'c'));
print_result(m.try_emplace( "c", "Won't be inserted"));
for (const auto& p : m)
print_node(p);
}
Вывод:
inserted: [a] = a inserted: [b] = abcd inserted: [c] = cccccccccc ignored: [c] = cccccccccc [a] = a [b] = abcd [c] = cccccccccc
См. также
| конструирует элемент на месте (открытая функция-член) |
|
| конструирует элементы на месте, используя подсказку (открытая функция-член) |
|
| вставляет элементы (открытая функция-член) |
|
| вставляет элемент или присваивает значение существующему элементу, если ключ уже существует (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/flat_map/try_emplace