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 -
Use
std::back_inserter
com o algoritmostd::set_intersection
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
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