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

Jinku Hu 12 octobre 2023
  1. Utilisez std::back_inserter pour construire un itérateur qui ajoute des éléments à la fin du conteneur
  2. Utilisez std::back_inserter avec l’algorithme std::set_intersection
Le modèle de fonction std::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
Auteur: 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