std::front_inserter en C++

std::front_inserter construye un iterador de inserción frontal que inserta nuevos elementos en la parte frontal del contenedor al que se aplica. Se define dentro del archivo de cabecera .

Un iterador de inserción frontal 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 comienzo del contenedor. Es exactamente lo contrario de std::back_inserter.

Sintaxis:

std::front_inserter (Container& x);

x: Container in which new elements will 
be inserted at the beginning.

Returns: A front_insert_iterator that inserts 
elements at the beginning of container x.
// C++ program to demonstrate std::front_inserter
#include <iostream>
#include <iterator>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
    // Declaring first container
    deque<int> v1 = { 1, 2, 3 };
  
    // Declaring second container for
    // copying values
    deque<int> v2 = { 4, 5, 6 };
  
    // Using std::front_inserter inside std::copy
    std::copy(v1.begin(), v1.end(), std::front_inserter(v2));
    // v2 now contains 3 2 1 4 5 6
  
    // 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 = 3 2 1 4 5 6 

¿Cómo es útil?

  • Invertir un contenedor: Ahora, dado que std::front_inserter inserta nuevos elementos al comienzo del contenedor, podemos realizar la tarea de copia inversa() solo con la ayuda de copy() , de modo que crearemos otro contenedor que contenga el reverso del envase actual.

    // C++ program to demonstrate std::front_inserter
    #include <iostream>
    #include <iterator>
    #include <deque>
    #include <algorithm>
    using namespace std;
    int main()
    {
        // Declaring first container
        deque<int> v1 = { 1, 2, 3 };
      
        // Declaring second container
        // for storing the reverse
        deque<int> v2;
      
        // Using std::front_inserter inside std::copy
        std::copy(v1.begin(), v1.end(), std::front_inserter(v2));
        // v2 now contains 3 2 1
      
        // 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 = 3 2 1
    

    Explicación: Aquí, comenzamos a copiar v1 en v2 pero desde el principio, por lo que cada vez que llegaba un nuevo elemento, se insertaba al principio, de esta manera, el último elemento insertado se convirtió en el primer elemento en el nuevo contenedor, y de esta manera pudimos invertir el contenido del contenedor.

Puntos para recordar:

  1. Uno de los inconvenientes de std::front_inserter es que solo se puede usar con aquellos contenedores que tienen push_front como uno de sus métodos, como en el caso de list y deque, y no se puede usar con vectores.
  2. push_front() vs front_inserter(): ahora, puede estar pensando que push_front() y front_inserter son similares, pero no lo son. Cuando tiene que pasar un iterador en el algoritmo, debe usar front_inserter como en el caso anterior, mientras que para insertar normalmente los valores al comienzo del contenedor, se puede usar push_front().
  3. En lugar de usar std::front_inserter, podemos crear un front_insert_iterator y luego usarlo, ya que eventualmente, std::front_inserter devuelve solo un front_insert_iterator.

    // C++ program to demonstrate front_insert_iterator
    #include <iostream>
    #include <iterator>
    #include <deque>
    #include <algorithm>
    using namespace std;
    int main()
    {
        // Declaring first container
        deque<int> v1 = { 1, 2, 3 };
      
        // Declaring second container for
        // copying values
        deque<int> v2 = { 4, 5, 6 };
      
        // Declaring a front_insert_iterator
        std::front_insert_iterator<std::deque<int> > front_i1(v2);
      
        // Using the iterator in the copy()
        std::copy(v1.begin(), v1.end(), front_i1);
        // v2 now contains 3 2 1 4 5 6
      
        // 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 = 3 2 1 4 5 6
    

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 *