La plantilla de función std::back_inserter en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::back_inserter para construir un iterador que agregue elementos al final del contenedor
  2. Utilice std::back_inserter con el algoritmo std::set_intersection
La plantilla de función std::back_inserter en C++

Este artículo explicará cómo utilizar la plantilla de función std::back_inserter en C++.

Utilice std::back_inserter para construir un iterador que agregue elementos al final del contenedor

Los iteradores, por lo general, proporcionan una interfaz común para acceder a diferentes tipos de contenedores. De hecho, los algoritmos STL utilizan a fondo esta interfaz. Sin embargo, tenga en cuenta que cada contenedor generalmente implementa un comportamiento personalizado que se adapta a la estructura de datos interna.

Además, tenemos un concepto de adaptadores de iterador, que proporcionan una funcionalidad especial además de la interfaz de iterador común. Es decir, inserte iteradores, que representan adaptadores de iteradores, sustituya la operación de asignación de elementos con inserción y deje que los algoritmos STL agreguen nuevos elementos al contenedor dado en lugar de sobrescribirlos.

Existen tres iteradores de inserción predefinidos: insertadores posteriores, insertadores frontales e insertadores generales. En este caso, demostramos un insertador posterior para agregar elementos al final del contenedor. Tenga en cuenta que los insertadores posteriores se pueden aplicar a los contenedores que tienen la función de miembro push_back.

El siguiente código de ejemplo muestra cómo aplicar el algoritmo std::fill_n al contenedor vector usando la función std::back_inserter que construye automáticamente un iterador de inserción posterior correspondiente.

#include <iostream>
#include <iterator>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printRange(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  std::fill_n(std::back_inserter(v1), 2, 100);
  cout << "v1: ";
  printRange(v1);

  return EXIT_SUCCESS;
}

Producción :

v1: 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 100; 100;

Utilice std::back_inserter con el algoritmo std::set_intersection

Alternativamente, podemos usar el std::back_inserter con el algoritmo std::set_intersection para almacenar elementos de dos colecciones en el contenedor de destino sin reservar el tamaño por adelantado. En el siguiente fragmento de código, aplicamos el método al contenedor std::vector.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printRange(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  vector<int> v2 = {1, 2, 3, 4};

  vector<int> v3;
  std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
                        std::back_inserter(v3));
  cout << "v3: ";
  printRange(v3);

  return EXIT_SUCCESS;
}

Producción :

v3: 1; 2; 3; 4;

Además, podemos usar back_inserter con objetos string ya que estos últimos implementan la interfaz del contenedor STL. Por lo tanto, con la ayuda del algoritmo std::set_union, podemos agregar las porciones de cadenas a otro objeto de cadena.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string s1("hello");
  string s2("there");
  string s3;

  std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
                 std::back_inserter(s3));
  cout << s3 << endl;

  return EXIT_SUCCESS;
}

Producción :

hellothere
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Iterator