Spec-Zone.ru › C++

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, если в контейнере нет элемента с таким ключом.

1) Если ключ, эквивалентный k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace, за исключением того, что элемент конструируется как
value_type(std::piecewise_construct,

std::forward_as_tuple(k),
std::forward_as_tuple

(std::forward<Args>(args)...))
2) Если ключ, эквивалентный k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace, за исключением того, что элемент конструируется как
value_type(std::piecewise_construct,

std::forward_as_tuple(std::move(k)),
std::forward_as_tuple

(std::forward<Args>(args)...))
3) Если ключ, эквивалентный k, уже существует в контейнере, ничего не делает. В противном случае, ведет себя как emplace_hint, за исключением того, что элемент конструируется как
value_type(std::piecewise_construct,

std::forward_as_tuple(k),
std::forward_as_tuple

(std::forward<Args>(args)...))
4) Если ключ, эквивалентный 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 - аргументы, передаваемые конструктору элемента

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

1,2) То же, что и для emplace.
3,4) То же, что и для emplace_hint.

Сложность

1,2) То же, что и для emplace.
3,4) То же, что и для 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

См. также

emplace
(C++11)
создаёт элемент на месте
(публичный член-функция)
emplace_hint
(C++11)
создаёт элементы на месте с использованием подсказки
(публичный член-функция)
insert
вставляет элементы или узлы(с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API