Espacios de nombres
Variantes
Acciones

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

De cppreference.com
< cpp‎ | container‎ | vector
 
 
 
 
template<class... Args>
void emplace_back( Args&&... args);
(desde C++11)
(hasta C++17)
template<class... Args>
reference emplace_back( Args&&... args);
(desde C++17)
(hasta C++20)
template<class... Args>
constexpr reference emplace_back( Args&&... args);
(desde C++20)

Anexa un nuevo elemento al final del contenedor. 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. Los argumentos args... se reenvían al constructor como std::forward<Args>(args)....

Si el nuevo tamaño (size()) es mayor que la capacidad (capacity()), incluyendo el iterador después del final, entonces se invalidan todos los iteradores y las referencias. De lo contrario, solamente se invalida el iterador después del final.

Contenido

[editar]Parámetros

args - Argumentos a reenviar al constructor del elemento.
Requisitos de tipo
-
T (el tipo de elemento del contenedor) debe satisfacer los requisitos de MoveInsertable y EmplaceConstructible.

[editar]Return value

(Ninguno)

(hasta C++17)

Una referencia al elemento insertado.

(desde C++17)

[editar]Complejidad

Constante amortizada.

[editar]Excepciones

Si se lanza una excepción, esta función no tiene efecto (garantía de excepción fuerte). Si el constructor de movimiento de T no es noexcept y no es CopyInsertable en *this, el vector utilizará el constructor de movimiento que lanza una excepción. Si lanza, la garantía se anula y los efectos no están especificados.

Notas

Ya que puede ocurrir una reasignación de memoria, emplace_back requiere que el tipo de elemento sea MoveInsertable para vectores.

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

[editar]Ejemplo

El siguiente código utiliza emplace_back para anexar un objeto de tipo Presidente a un std::vector. Demuestra cómo emplace_back reenvía los parámetros al constructor de Presidente y muestra cómo el uso de emplace_back evita la operación de copia o movimiento extra requerida al usar push_back.

#include <vector>#include <string>#include <cassert>#include <iostream>   struct Presidente {std::string nombre;std::string pais;int periodo;   Presidente(std::string p_nombre, std::string p_pais, int p_periodo): nombre(std::move(p_nombre)), pais(std::move(p_pais)), periodo(p_periodo){std::cout<<"Me construyen.\n";} Presidente(Presidente&& otro): nombre(std::move(otro.nombre)), pais(std::move(otro.pais)), periodo(otro.periodo){std::cout<<"Me mueven.\n";} Presidente& operator=(const Presidente& otro)=default;};   int main(){std::vector<Presidente> elecciones;std::cout<<"emplace_back:\n";auto& ref = elecciones.emplace_back("Nelson Mandela", "Sudáfrica", 1994);assert(ref.periodo==1994&&"usa una referencia al objeto creado (C++17)");   std::vector<Presidente> reelecciones;std::cout<<"\npush_back:\n"; reelecciones.push_back(Presidente("Franklin Delano Roosevelt", "los Estados Unidos", 1936));   std::cout<<"\nContenido:\n";for(Presidente const& presidente: elecciones){std::cout<< presidente.nombre<<" fue reelegido presidente de "<< presidente.pais<<" en "<< presidente.periodo<<".\n";}for(Presidente const& presidente: reelecciones){std::cout<< presidente.nombre<<" fue reelegido presidente de "<< presidente.pais<<" en "<< presidente.periodo<<".\n";}}

Salida:

emplace_back: Me construyen.   push_back: Me construyen. Me mueven.   Contenido: Nelson Mandela fue reelegido presidente de Sudáfrica en 1994. Franklin Delano Roosevelt fue reelegido presidente de los Estados Unidos en 1936.

[editar]Véase también

Agrega elementos al final.
(función miembro pública)[editar]
(C++11)
Construye el elemento en el sitio.
(función miembro pública)[editar]
close