std::insertor en C++

std::inserter construye un iterador de inserción que inserta nuevos elementos en x en ubicaciones sucesivas comenzando en la posición señalada por él. Se define dentro del archivo de cabecera.

Un iterador de inserción 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 en una posición específica en el contenedor.
Sintaxis:

std::inserter(Container& x, typename Container::iterator it);
x: Container in which new elements will 
be inserted.
it: Iterator pointing to the insertion point.

Returns: An insert_iterator that inserts elements into 
x at the position indicated by it.
// C++ program to demonstrate std::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 };
  
    deque<int>::iterator i1;
    i1 = v2.begin() + 1;
    // i1 points to next element of 4 in v2
  
    // Using std::inserter inside std::copy
    std::copy(v1.begin(), v1.end(), std::inserter(v2, i1));
    // v2 now contains 4 1 2 3 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 = 4 1 2 3 5 6 

¿Cómo es útil?

  • Inserción de valores en cualquier lugar: ahora, imagínense, si tuviéramos que copiar valores en un contenedor como un vector, primero, teníamos que mover elementos y luego copiar, pero con la ayuda de std::insert() podemos insertar en cualquier lugar. posición con facilidad.

    // C++ program to demonstrate std::inserter
    #include <iostream>
    #include <iterator>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int main()
    {
        // Declaring first container
        vector<int> v1 = { 1, 2, 3, 7, 8, 9 };
      
        // Declaring second container
        vector<int> v2 = { 4, 5, 6 };
      
        vector<int>::iterator i1;
        i1 = v2.begin() + 2;
        // i1 points to next element of 5 in v2
      
        // Using std::inserter inside std::copy
        std::copy(v1.begin(), v1.end(), std::inserter(v2, i1));
        // v2 now contains 4 5 1 2 3 7 8 9 6
      
        // Displaying v1 and v2
        cout << "v1 = ";
      
        int i;
        for (i = 0; i < 6; ++i) {
            cout << v1[i] << " ";
        }
      
        cout << "\nv2 = ";
        for (i = 0; i < 9; ++i) {
            cout << v2[i] << " ";
        }
      
        return 0;
    }

    Producción:

    v1 = 1 2 3 7 8 9
    v2 = 4 5 1 2 3 7 8 9 6
    

    Explicación: Aquí, comenzamos a copiar v1 en v2 pero no desde el principio, sino después de la segunda posición de v2, es decir, después de 5, por lo que todos los elementos de v1 se insertaron después de 5 y antes de 6. De esta manera, insertamos valor donde queríamos con bastante facilidad.

Puntos para recordar:

  1. Una de las trampas de std::inserter es que puede usarse solo con aquellos contenedores que tienen insertar como uno de sus métodos, como en el caso de vector, list y deque, y así sucesivamente.
  2. insert() vs std::inserter(): Ahora, puede estar pensando que insert() y std::inserter() son similares, pero no lo son. Cuando tiene que pasar un iterador en el algoritmo, debe usar inserter() como en el caso anterior, mientras que para insertar normalmente los valores en el contenedor, se puede usar insert().
  3. En lugar de usar std::inserter, podemos crear un insert_iterator y luego usarlo, ya que eventualmente, std::inserter solo devuelve un insert_iterator.

    // C++ program to demonstrate 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 };
      
        deque<int>::iterator ii;
        ii = v2.begin() + 1;
        // ii points after 4 in v2
      
        // Declaring a insert_iterator
        std::insert_iterator<std::deque<int> > i1(v2, ii);
      
        // Using the iterator in the copy()
        std::copy(v1.begin(), v1.end(), i1);
        // v2 now contains 4 1 2 3 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 = 4 1 2 3 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 *