Die std::back_inserter-Funktionsvorlage in C++
-
Verwenden Sie
std::back_inserter
, um einen Iterator zu konstruieren, der Elemente am Ende des Containers anhängt -
Verwendung von
std::back_inserter
mitstd::set_intersection
Algorithmus
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
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