Метод try_emplace
Метод try_emplace класса map вставляет новый элемент в контейнер, но только в том случае, если элемента с таким ключом еще нет. Если ключ уже присутствует в контейнере, метод ничего не делает и не изменяет существующее значение. Первым параметром метод принимает ключ, а следующими параметрами - аргументы для конструктора значения. В отличие от метода insert, который может копировать или перемещать объект, try_emplace создает значение непосредственно в контейнере, что позволяет избежать лишних копирований.
Синтаксис
map.try_emplace(key, args...)
Пример
Давайте создадим map и попробуем вставить элемент с ключом "b", которого еще нет в контейнере:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int> mp = {{"a", 1}, {"c", 3}};
auto [it, inserted] = mp.try_emplace("b", 2);
cout << "inserted: " << inserted << endl;
cout << "key: " << it->first << ", value: " << it->second << endl;
return 0;
}
Результат выполнения кода:
"inserted: 1"
"key: b, value: 2"
Пример
Теперь попробуем вставить элемент с ключом "a", который уже существует в контейнере. Значение при этом не должно измениться:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int> mp = {{"a", 1}, {"c", 3}};
auto [it, inserted] = mp.try_emplace("a", 99);
cout << "inserted: " << inserted << endl;
cout << "key: " << it->first << ", value: " << it->second << endl;
return 0;
}
Результат выполнения кода:
"inserted: 0"
"key: a, value: 1"
Пример
Давайте переберем все элементы map после нескольких вызовов try_emplace, чтобы убедиться, что существующие значения не перезаписались:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int> mp = {{"a", 1}, {"c", 3}};
mp.try_emplace("b", 2);
mp.try_emplace("a", 99);
mp.try_emplace("d", 4);
for (const auto& [key, value] : mp)
{
cout << key << ": " << value << endl;
}
return 0;
}
Результат выполнения кода:
"a: 1"
"b: 2"
"c: 3"
"d: 4"
Смотрите также
-
класс
map,
который хранит пары ключ-значение -
метод
insert,
который вставляет элементы в map -
метод
emplace,
который создает элемент прямо в контейнере -
метод
insert_or_assign,
который вставляет или перезаписывает значение