Spec-Zone.ru › C++

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 Не было ясно, могут ли аргументы ссылаться на контейнер Выяснено

См. также

insert
вставляет элементы
(публичный член-функция)
emplace_back
(C++11)
создает элемент на месте в конце
(публичный член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/deque/emplace

Spec-Zone.ru

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