O modelo de função std::back_inserter em C++

Jinku Hu 12 outubro 2023
  1. Use std::back_inserter para construir um iterador que anexa elementos no final do contêiner
  2. Use std::back_inserter com o algoritmo std::set_intersection
O modelo de função std::back_inserter em C++

Este artigo irá explicar como utilizar o modelo de função std::back_inserter em C++.

Use std::back_inserter para construir um iterador que anexa elementos no final do contêiner

Os iteradores, geralmente, fornecem uma interface comum para acessar diferentes tipos de contêiner. Na verdade, essa interface é totalmente utilizada pelos algoritmos STL. Observe, porém, que cada contêiner geralmente implementa um comportamento personalizado adequado para a estrutura de dados interna.

Além disso, temos um conceito de adaptadores de iterador, que fornecem funcionalidade especial no topo da interface do iterador comum. A saber, inserir iteradores, que representam adaptadores de iteradores, substituir a operação de atribuição de elemento por inserção e permitir que algoritmos STL adicionem novos elementos ao contêiner fornecido em vez de sobrescrevê-los.

Existem três iteradores de insertos predefinidos: insersores traseiros, insersores frontais e insersores gerais. Nesse caso, demonstramos um insersor traseiro para anexar elementos no final do contêiner. Observe que os insersores de retorno podem ser aplicados aos contêineres que possuem a função de membro push_back.

O código de exemplo a seguir mostra como aplicar o algoritmo std::fill_n ao contêiner vetor usando a função std::back_inserter que constrói automaticamente um iterador de inserção posterior correspondente.

#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;
}

Produção:

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

Use std::back_inserter com o algoritmo std::set_intersection

Alternativamente, podemos usar o std::back_inserter com o algoritmo std::set_intersection para armazenar elementos de duas coleções no recipiente de destino sem reservar o tamanho antecipadamente. No próximo trecho de código, aplicamos o método ao contêiner 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;
}

Produção:

v3: 1; 2; 3; 4;

Além disso, podemos usar back_inserter com objetos string, já que os últimos implementam a interface do contêiner STL. Assim, com a ajuda do algoritmo std::set_union, podemos anexar as partes das strings a outro objeto string.

#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;
}

Produção:

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