std::deque<T,Allocator>:: emplace
|
template
<
class
...
Args
>
iterator emplace ( const_iterator pos, Args && ... args ) ; |
(начиная с C++11)
(constexpr начиная с C++26) |
|
Вставляет новый элемент в контейнер непосредственно перед pos .
Элемент создаётся с помощью std::allocator_traits::construct , который обычно использует размещающий new для создания элемента на месте в расположении, предоставленном контейнером. Однако если требуемое расположение уже занято существующим элементом, вставляемый элемент сначала создаётся в другом месте, а затем перемещается присваиванием в требуемое расположение.
Аргументы args... передаются конструктору как std:: forward < Args > ( args ) ... . args... могут прямо или косвенно ссылаться на значение в контейнере.
Все итераторы (включая
end()
итератор) инвалидируются. Ссылки также инвалидируются, за исключением случаев, когда
pos
==
begin()
или
pos
==
end()
, в этом случае они не инвалидируются.
Содержание |
Параметры
| pos | - | итератор, перед которым будет создан новый элемент |
| args | - | аргументы для передачи конструктору элемента |
| Требования к типам | ||
-
|
||
Возвращаемое значение
Итератор, указывающий на вставленный элемент.
Сложность
Линейно по меньшему из расстояний между pos и любым из концов контейнера.
Исключения
Если исключение выбрасывается не конструктором копирования, конструктором перемещения, оператором присваивания или оператором перемещающего присваивания
T
, или если исключение выбрасывается при использовании
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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2164 | C++11 | было неясно, могут ли аргументы ссылаться на контейнер | прояснено |
Смотрите также
|
вставляет элементы
(публичная функция-член) |
|
|
(C++11)
|
создаёт элемент на месте в конце
(публичная функция-член) |