Die std::back_inserter-Funktionsvorlage in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie std::back_inserter, um einen Iterator zu konstruieren, der Elemente am Ende des Containers anhängt
  2. Verwendung von std::back_inserter mit std::set_intersection Algorithmus
Die std::back_inserter-Funktionsvorlage in C++

Dieser Artikel erklärt, wie Sie das Funktionstemplate std::back_inserter in C++ verwenden.

Verwenden Sie std::back_inserter, um einen Iterator zu konstruieren, der Elemente am Ende des Containers anhängt

Iteratoren bieten im Allgemeinen eine gemeinsame Schnittstelle für den Zugriff auf verschiedene Containertypen. Tatsächlich wird diese Schnittstelle von den STL-Algorithmen gründlich genutzt. Beachten Sie jedoch, dass jeder Container normalerweise ein benutzerdefiniertes Verhalten implementiert, das für die interne Datenstruktur geeignet ist.

Darüber hinaus haben wir ein Konzept von Iteratoradaptern, die über die gemeinsame Iteratorschnittstelle hinaus spezielle Funktionen bieten. Fügen Sie nämlich Iteratoren ein, die Iteratoradapter darstellen, ersetzen Sie die Elementzuweisungsoperation durch Einfügen und lassen Sie STL-Algorithmen neue Elemente zu dem gegebenen Container hinzufügen, anstatt sie zu überschreiben.

Es gibt drei vordefinierte Insert-Iteratoren: Back-Inserter, Front-Inserter und allgemeine Inserter. In diesem Fall demonstrieren wir einen Back-Inserter zum Anhängen von Elementen am Ende des Containers. Beachten Sie, dass Back-Inserter auf die Container angewendet werden können, die die Memberfunktion push_back haben.

Der folgende Beispielcode zeigt, wie man den std::fill_n-Algorithmus auf den vector-Container mit der Funktion std::back_inserter anwendet, die automatisch einen entsprechenden Back-Inserter-Iterator erstellt.

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

Ausgabe:

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

Verwendung von std::back_inserter mit std::set_intersection Algorithmus

Alternativ können wir den std::back_inserter mit dem std::set_intersection-Algorithmus verwenden, um Elemente aus zwei Sammlungen im Zielcontainer zu speichern, ohne die Größe im Voraus zu reservieren. Im nächsten Code-Schnipsel wenden wir die Methode auf den Container std::vector an.

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

Ausgabe:

v3: 1; 2; 3; 4;

Zusätzlich können wir back_inserter mit string-Objekten verwenden, da letztere das STL-Container-Interface implementieren. So können wir mit Hilfe des Algorithmus std::set_union die Teile von Strings an ein anderes String-Objekt anhängen.

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

Ausgabe:

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

Verwandter Artikel - C++ Iterator