HOWTO · C++

Le modèle de fonction std::back_inserter en C++

Cet article montre comment utiliser le modèle de fonction st::back_inserter en C++

Cet article explique comment utiliser le modèle de fonction std::back_inserter en C++.

Utilisez std::back_inserter pour construire un itérateur qui ajoute des éléments à la fin du conteneur

Les itérateurs, en général, fournissent une interface commune pour accéder à différents types de conteneurs. En fait, cette interface est entièrement utilisée par les algorithmes STL. Notez, cependant, que chaque conteneur implémente généralement un comportement personnalisé adapté à la structure de données interne.

De plus, nous avons un concept d’adaptateurs d’itérateurs, qui fournissent des fonctionnalités spéciales en plus de l’interface d’itérateurs commune. À savoir, les itérateurs d’insertion, qui représentent les adaptateurs d’itérateurs, remplacent l’opération d’affectation d’élément par l’insertion et permettent aux algorithmes STL d’ajouter de nouveaux éléments au conteneur donné plutôt que de les écraser.

Il existe trois itérateurs d’insertion prédéfinis : les inséreuses arrière, les inséreuses avant et les inséreuses générales. Dans ce cas, nous démontrons un inserteur arrière pour ajouter des éléments à la fin du conteneur. Notez que les inserteurs arrière peuvent être appliqués aux conteneurs qui ont la fonction membre push_back.

L’exemple de code suivant montre comment appliquer l’algorithme std::fill_n au conteneur vector à l’aide de la fonction std::back_inserter qui construit automatiquement un itérateur d’insertion arrière correspondant.

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

Production:

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

Utilisez std::back_inserter avec l’algorithme std::set_intersection

Alternativement, nous pouvons utiliser le std::back_inserter avec l’algorithme std::set_intersection pour stocker des éléments de deux collections dans le conteneur de destination sans réserver la taille à l’avance. Dans le prochain extrait de code, nous appliquons la méthode au conteneur 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;
}

Production:

v3: 1; 2; 3; 4;

De plus, nous pouvons utiliser back_inserter avec des objets string car ces derniers implémentent l’interface du conteneur STL. Ainsi, à l’aide de l’algorithme std::set_union, nous pouvons ajouter les portions de chaînes à un autre objet chaîne.

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

Production:

hellothere