std::deque<T,Allocator>::emplace
template< class... Args > iterator emplace( const_iterator pos, Args&&... args ); |
(с C++11) |
Вставляет новый элемент в контейнер непосредственно перед pos.
Элемент конструируется с помощью std::allocator_traits::construct, что обычно использует placement-new для построения элемента непосредственно на месте в позиции, предоставленной контейнером. Однако, если требуемая позиция занята существующим элементом, вставляемый элемент сначала конструируется в другом месте, а затем перемещается в требуемое место.
Аргументы args... передаются в конструктор в качестве std::forward<Args>(args).... args... может напрямую или косвенно ссылаться на значение в контейнере.
Все итераторы (включая итератор end()) становятся недействительными. Ссылки также становятся недействительными, за исключением случаев, когда pos == begin() или pos == end(), в таком случае они не становятся недействительными.
Параметры
| pos | - | итератор перед которым будет сконструирован новый элемент |
| args | - | аргументы для передачи в конструктор элемента |
| Требования к типу | ||
-T (the container's element type) должен удовлетворять требованиям MoveAssignable, MoveInsertable и EmplaceConstructible. |
||
Возвращаемое значение
Итератор, указывающий на помещённый элемент.
Сложность
Линейная, с меньшим расстоянием между pos и любым из концов контейнера.
Исключения
Если исключение выбрасывается иначе, чем конструктором копирования, конструктором перемещения, оператором присваивания или оператором присваивания перемещения типа значения, или если исключение выбрасывается при использовании emplace для вставки одного элемента в один из концов, эффекты отсутствуют (сильная гарантия исключений).
В противном случае эффекты не определены.
Пример
#include <iostream>
#include <string>
#include <deque>
struct A
{
std::string s;
A(std::string str) : s(std::move(str)) { std::cout << " constructed\n"; }
A(const A& o) : s(o.s) { std::cout << " copy constructed\n"; }
A(A&& o) : s(std::move(o.s)) { std::cout << " move constructed\n"; }
A& operator=(const A& other)
{
s = other.s;
std::cout << " copy assigned\n";
return *this;
}
A& operator=(A&& other)
{
s = std::move(other.s);
std::cout << " move assigned\n";
return *this;
}
};
int main()
{
std::deque<A> container;
std::cout << "construct 2 times A:\n";
A two { "two" };
A three { "three" };
std::cout << "emplace:\n";
container.emplace(container.end(), "one");
std::cout << "emplace with A&:\n";
container.emplace(container.end(), two);
std::cout << "emplace with A&&:\n";
container.emplace(container.end(), std::move(three));
std::cout << "content:\n";
for (const auto& obj : container)
std::cout << ' ' << obj.s;
std::cout << '\n';
}Вывод:
construct 2 times A: constructed constructed emplace: constructed emplace with A&: copy constructed emplace with A&&: move constructed content: one two three
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 2164 | C++11 | Не было ясно, могут ли аргументы ссылаться на контейнер | Выяснено |
См. также
| вставляет элементы (публичный член-функция) |
|
|
(C++11) |
создает элемент на месте в конце (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/deque/emplace