std::back_inserter construye un iterador de inserción posterior que inserta nuevos elementos al final del contenedor al que se aplica. Se define dentro del archivo de cabecera .
Un iterador de inserción posterior es un tipo especial de iterador de salida diseñado para permitir que los algoritmos que generalmente sobrescriben elementos (como copiar) inserten nuevos elementos automáticamente al final del contenedor.
Sintaxis:
std::back_inserter (Container& x); x: Container in which new elements will be inserted at the end. Returns: A back_insert_iterator that inserts elements at the end of container x.
// C++ program to demonstrate std::back_inserter #include <iostream> #include <iterator> #include <vector> #include <algorithm> using namespace std; int main() { // Declaring first container vector<int> v1 = { 1, 2, 3 }; // Declaring second container for // copying values vector<int> v2 = { 4, 5, 6 }; // Using std::back_inserter inside std::copy std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); // v2 now contains 4 5 6 1 2 3 // Displaying v1 and v2 cout << "v1 = "; int i; for (i = 0; i < 3; ++i) { cout << v1[i] << " "; } cout << "\nv2 = "; for (i = 0; i < 6; ++i) { cout << v2[i] << " "; } return 0; }
Producción:
v1 = 1 2 3 v2 = 4 5 6 1 2 3
¿Cómo es útil?
- No se requiere conocimiento previo del tamaño del contenedor: uno de los escenarios en los que dicha función puede ser extremadamente útil es cuando no sabemos el tamaño del contenedor, es decir, cuántos elementos se insertarán en él, por lo que una forma es haga que ese contenedor tenga un tamaño extremadamente grande, pero la forma más eficiente será usar std::back_inserter() en tal caso, sin declarar el tamaño del contenedor.
// C++ program to demonstrate std::back_inserter
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using
namespace
std;
int
main()
{
// Declaring first container
vector<
int
> v1 = { 1, 2, 3 };
// Declaring second container without specifying
// its size
vector<
int
> v2;
// Using std::back_inserter inside std::copy
std::copy(v1.begin(), v1.end(), std::back_inserter(v2));
// v2 now contains 1 2 3
// Displaying v1 and v2
cout <<
"v1 = "
;
int
i;
for
(i = 0; i < 3; ++i) {
cout << v1[i] <<
" "
;
}
cout <<
"\nv2 = "
;
for
(i = 0; i < 3; ++i) {
cout << v2[i] <<
" "
;
}
return
0;
}
Producción:
v1 = 1 2 3 v2 = 1 2 3
Explicación: aquí, tuvimos que copiar v1 en v2, pero digamos que estamos en un escenario en el que no sabemos cuántos elementos se copiarán en v2, por lo que no especificaremos su tamaño y luego lo copiaremos usando std::back_inserter().
¿Por qué no v2.begin() en lugar de back_inserter()? Muchos de ustedes pensarán que por qué no hemos usado v2.begin() en lugar de std::back_inserter(v2), entonces deben repensar que dado que no hemos declarado el tamaño de v2, por lo tanto, no hay elementos en él, por lo que no habrá comienzo y, por lo tanto, v2.begin() arrojará un error aquí.
Puntos para recordar:
- Una de las trampas de std::back_inserter es que puede usarse solo con aquellos contenedores que tienen push_back como uno de sus métodos, como en el caso de vector, list y deque.
- push_back() vs back_inserter(): ahora, puede estar pensando que push_back() y back_inserter son similares, pero no lo son. Cuando tiene que pasar un iterador en el algoritmo, debe usar back_inserter como en el caso anterior, mientras que para insertar normalmente los valores al final del contenedor, se puede usar push_back().
- En lugar de usar std::back_inserter, podemos crear un back_insert_iterator y luego usarlo como eventualmente, std::back_inserter solo devuelve un back_insert_iterator.
// C++ program to demonstrate back_insert_iterator
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using
namespace
std;
int
main()
{
// Declaring first container
vector<
int
> v1 = { 1, 2, 3 };
// Declaring second container for
// copying values
vector<
int
> v2 = { 4, 5, 6 };
// Declaring a back_insert_iterator
std::back_insert_iterator<std::vector<
int
> > back_i1(v2);
// Using the iterator in the copy()
std::copy(v1.begin(), v1.end(), back_i1);
// v2 now contains 4 5 6 1 2 3
// Displaying v1 and v2
cout <<
"v1 = "
;
int
i;
for
(i = 0; i < 3; ++i) {
cout << v1[i] <<
" "
;
}
cout <<
"\nv2 = "
;
for
(i = 0; i < 6; ++i) {
cout << v2[i] <<
" "
;
}
return
0;
}
Producción:
v1 = 1 2 3 v2 = 4 5 6 1 2 3
Este artículo es una contribución de Mrigendra Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA