std::map<Key,T,Compare,Allocator>::try_emplace
template< class... Args > std::pair<iterator, bool> try_emplace( const Key& k, Args&&... args ); |
(1) | (с C++17) |
template< class... Args > std::pair<iterator, bool> try_emplace( Key&& k, Args&&... args ); |
(2) | (с C++17) |
template< class... Args > iterator try_emplace( const_iterator hint, const Key& k, Args&&... args ); |
(3) | (с C++17) |
template< class... Args > iterator try_emplace( const_iterator hint, Key&& k, Args&&... args ); |
(4) | (с C++17) |
Вставляет новый элемент в контейнер с ключом k и значением, построенным с помощью args, если в контейнере нет элемента с таким ключом.
k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace, за исключением того, что элемент конструируется какvalue_type(std::piecewise_construct,
std::forward_as_tuple(k),
std::forward_as_tuple
(std::forward<Args>(args)...))
k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace, за исключением того, что элемент конструируется какvalue_type(std::piecewise_construct,
std::forward_as_tuple(std::move(k)),
std::forward_as_tuple
(std::forward<Args>(args)...))
k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace_hint, за исключением того, что элемент конструируется какvalue_type(std::piecewise_construct,
std::forward_as_tuple(k),
std::forward_as_tuple
(std::forward<Args>(args)...))
k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace_hint, за исключением того, что элемент конструируется какvalue_type(std::piecewise_construct,
std::forward_as_tuple(std::move(k)),
std::forward_as_tuple
(std::forward<Args>(args)...))
Ни один итератор или ссылка не становятся недействительными.
Параметры
| k | - | ключ, используемый для поиска и вставки, если не найден |
| hint | - | итератор на позицию перед которой будет вставлен новый элемент |
| args | - | аргументы, передаваемые конструктору элемента |
Возвращаемое значение
emplace.emplace_hint.Сложность
emplace.emplace_hint.Примечания
В отличие от insert или emplace, эти функции не перемещают из аргументов rvalue, если вставка не происходит, что упрощает работу с картами, значения которых являются типами, которые можно перемещать только один раз, такими как std::map<std::string, std::unique_ptr<foo>>. Кроме того, try_emplace обрабатывает ключ и аргументы для mapped_type отдельно, в отличие от emplace, который требует аргументов для построения value_type (то есть std::pair).
| Макрос проверки возможностей | Значение | Std | Функция |
|---|---|---|---|
__cpp_lib_map_try_emplace |
201411L | (C++17) |
std::map::try_emplace, std::map::insert_or_assign |
Пример
#include <iostream>
#include <string>
#include <utility>
#include <map>
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
См. также
|
(C++11)
|
создаёт элемент на месте (публичный член-функция) |
|
(C++11)
|
создаёт элементы на месте с использованием подсказки (публичный член-функция) |
| вставляет элементы или узлы(с C++17) (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/map/try_emplace