Метод emplace
Метод emplace добавляет новый элемент в контейнер set.
В отличие от метода insert, который принимает уже готовый объект,
emplace конструирует элемент непосредственно внутри контейнера,
передавая свои аргументы конструктору типа элемента.
Это позволяет избежать создания временной копии объекта.
Метод возвращает пару pair, первый элемент которой -
итератор на добавленный (или уже существующий) элемент,
а второй - значение типа bool, равное true,
если вставка произошла, и false, если такой элемент
уже был в множестве.
Синтаксис
set.emplace(args...)
Пример
Давайте добавим в множество set несколько чисел
с помощью метода emplace и выведем результат:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> st;
st.emplace(1);
st.emplace(2);
st.emplace(3);
for (int elem : st) {
cout << elem << " ";
}
return 0;
}
Результат выполнения кода:
1 2 3
Пример
Давайте проверим, что произойдёт при попытке добавить
уже существующий элемент. Метод вернёт итератор на
существующий элемент и false во втором поле пары:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> st;
st.emplace(1);
st.emplace(2);
auto res = st.emplace(2);
cout << boolalpha;
cout << "inserted: " << res.second << endl;
cout << "value: " << *res.first << endl;
return 0;
}
Результат выполнения кода:
"inserted: false"
"value: 2"
Пример
Давайте добавим в множество строки, используя метод
emplace с несколькими аргументами конструктора:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
set<string> st;
st.emplace("abcde");
st.emplace("12345");
for (const string& elem : st) {
cout << elem << " ";
}
return 0;
}
Результат выполнения кода:
"12345 abcde"