Espacios de nombres
Variantes
Acciones

std::vector<T,Allocator>::emplace

De cppreference.com
< cpp‎ | container‎ | vector
 
 
 
 
template<class... Args>
iterator emplace( const_iterator pos, Args&&... args);
(desde C++11)
(constexpr desde C++20)

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.

Si el nuevo tamaño (size()) es mayor que la capacidad (capacity()), se invalidan todas los iteradores y las referencias. De lo contrario, solamente los iteradores y referencias antes del punto de inserción se mantienen válidas. El iterador después del final también se invalida.

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 distancia entre pos y el final 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 el final del contenedor y el tipo de valor es ya sea CopyInsertable o no lanza y construible por movimiento, no hay efectos (garantía de excepción fuerte).

De lo contrario, los efectos no están especificados.

Notas

La especialización std::vector<bool> no tenía la función miembro emplace() hasta C++14.

Ejemplo

#include <iostream>#include <string>#include <vector>   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::vector<Un> container;// reservar suficiente espacio para que el vector no tenga// que cambiar el tamaño container.reserve(10);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)[editar]
Construye un elemento en el sitio al final.
(función miembro pública)[editar]
close