std::back_inserter en C++

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:

  1. 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.
  2. 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().
  3. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *