std::list<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... могут прямо или косвенно ссылаться на значение в контейнере.
Никакие итераторы или ссылки не инвалидируются.
Содержание
Параметры
Возвращаемое значениеИтератор, указывающий на вставленный элемент. СложностьКонстанта. ИсключенияЕсли исключение выбрасывается (например, конструктором), контейнер остается неизменным, как если бы эта функция никогда не вызывалась (строгая гарантия исключений). Пример
Запустить этот код
#include <iostream> #include <string> #include <list> 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::list<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++.
Смотрите также
| ||||||||||||||||||||||||