std::deque<T,Allocator>::emplace
template<class... Args> iterator emplace( const_iterator pos, Args&&... args); | (desde C++11) | |
Inserta un nuevo elemento en el contenedor directamente antes de la posición pos
.
El elemento se construye a través de std::allocator_traits::construct, que por lo general utiliza new de ubicación para construir el elemento en el sitio en una ubicación proporcionada por el contenedor. Sin embargo, si la ubicación requerida ha sido ocupada por un elemento existente, el elemento insertado se construye primero en otra ubicación y luego se asigna por movimiento a la ubicación requerida.
Los argumentos args...
se reenvían al constructor como std::forward<Args>(args).... args...
puede referirse a un valor en el contenedor directamente o indirectamente.
Se invalidan todos los iteradores, incluyendo el iterador después del final. También se invalidan las referencias, a menos que pos == begin() o pos == end(), en cuyo caso no se invalidan.
Contenido |
[editar]Parámetros
pos | - | Iterador antes del cual se construirá el nuevo elemento. |
args | - | Argumentos a reenviar al constructor del elemento. |
Requisitos de tipo | ||
-T (el tipo de elemento del contenedor) debe satisfacer los requisitos de MoveAssignable, MoveInsertable y EmplaceConstructible. |
[editar]Valor de retorno
Iterador que apunta al elemento emplazado.
[editar]Complejidad
Lineal en la menor de las distancias entre la posición pos
y cualquiera de los extremos del contenedor.
[editar]Excepciones
Si se lanza una excepción por otro que no sea el constructor de copia, el constructor de movimiento, el operador de asignación o el operador de asignación de movimiento del tipo de valor, o si se lanza una excepción mientras se usa emplace
para insertar un solo elemento en cualquier extremidad del contenedor, no hay efectos (garantía de excepción fuerte).
De lo contrario, los efectos no están especificados.
Ejemplo
#include <iostream>#include <string>#include <deque> struct Un {std::string s; Un(std::string str): s(std::move(str)){std::cout<<" construido\n";} Un(const Un& o): s(o.s){std::cout<<" construido por copia\n";} Un(Un&& o): s(std::move(o.s)){std::cout<<" construido por movimiento\n";} Un& operator=(const Un& other){ s = other.s;std::cout<<" asignado por copia\n";return*this;} Un& operator=(Un&& other){ s = std::move(other.s);std::cout<<" asignado por movimiento\n";return*this;}}; int main(){std::deque<Un> container; std::cout<<"construir 2 veces Un:\n"; Un dos {"dos"}; Un tres {"tres"}; std::cout<<"emplazar:\n"; container.emplace(container.end(), "uno"); std::cout<<"emplazar con Un&:\n"; container.emplace(container.end(), dos); std::cout<<"emplazar con Un&&:\n"; container.emplace(container.end(), std::move(tres)); std::cout<<"contenido:\n";for(constauto& obj : container)std::cout<<' '<< obj.s;std::cout<<'\n';}
Salida:
construir 2 veces Un: construido construido emplazar: construido emplazar con Un&: construido por copia emplazar con Un&&: construido por movimiento contenido: uno dos tres
[editar]Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 2164 | C++11 | No estaba claro si los argumentos se podían referir al contenedor. | Se clarificó. |
[editar]Véase también
Inserta elementos (función miembro pública) | |
(C++11) | Construye un elemento en el sitio al final. (función miembro pública) |