std::vector<T,Allocator>:: emplace
|
template
<
class
...
Args
>
iterator emplace ( const_iterator pos, Args && ... args ) ; |
(начиная с C++11)
(constexpr начиная с C++20) |
|
Вставляет новый элемент в контейнер непосредственно перед pos .
Элемент создаётся с помощью std::allocator_traits::construct , который обычно использует размещающий new для создания элемента на месте в расположении, предоставленном контейнером. Однако, если требуемое расположение уже занято существующим элементом, вставляемый элемент сначала создаётся в другом месте, а затем перемещается присваиванием в требуемое расположение.
Аргументы args... передаются конструктору как std:: forward < Args > ( args ) ... . args... могут прямо или косвенно ссылаться на значение в контейнере.
Если после операции новый
size()
становится больше старого
capacity()
происходит перераспределение памяти, в этом случае все итераторы (включая итератор
end()
) и все ссылки на элементы становятся недействительными. В противном случае только итераторы и ссылки до точки вставки сохраняют свою валидность.
Содержание
Параметры
Возвращаемое значениеИтератор, указывающий на вставленный элемент. СложностьЛинейно по расстоянию между pos и end() . Исключения
Если исключение выбрасывается не конструктором копирования, конструктором перемещения, оператором присваивания или оператором перемещающего присваивания
В противном случае, эффекты не определены. Пример
Запустить этот код
#include <iostream> #include <string> #include <vector> 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::vector<A> container; // reserve enough place so vector does not have to resize container.reserve(10); 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++.
Смотрите также
| ||||||||||||||||||||||||