C++-Standardbibliothek<iterator>
In der C++-Standardbibliothek,<iterator>Die Header-Datei stellt eine Reihe von Werkzeugen zum Durchlaufen von Elementen in Containern bereit. Iteratoren sind eines der Kernkonzepte der C++-Standard Template Library (STL); sie ermöglichen Programmierern, in einheitlicher Weise auf Elemente in Containern zuzugreifen, ohne sich um die spezifischen Implementierungsdetails des Containers kümmern zu müssen.
Ein Iterator ist ein Objekt, das eine Methode zum Durchlaufen von Elementen in einem Container bereitstellt. Ein Iterator kann als Zeiger auf ein Element in einem Container betrachtet werden, ist aber flexibler und leistungsfähiger als ein Zeiger. Iteratoren können verwendet werden, um auf Elemente in einem Container zuzugreifen und sie zu ändern, und sie können zusammen mit STL-Algorithmen verwendet werden.
Iteratoren werden hauptsächlich in die folgenden Kategorien eingeteilt:
- Eingabe-Iterator: Kann nur einzelne Leseoperationen ausführen, keine Schreiboperationen.
- Ausgabe-Iterator: Kann nur einzelne Schreiboperationen ausführen, keine Leseoperationen.
- Vorwärts-Iterator: Kann Lese- und Schreiboperationen ausführen und sich vorwärts bewegen.
- Bidirektionaler Iterator: Zusätzlich zu allen Operationen eines Vorwärts-Iterators kann er sich auch rückwärts bewegen.
- Iterator mit wahlfreiem Zugriff: Zusätzlich zu allen Operationen eines bidirektionalen Iterators kann er auch wahlfreien Zugriff ausführen, wie z. B. den Zugriff auf Elemente über den Index.
Gängige Funktionen (wichtiger Punkt)
| Funktion | Funktion | Beispiel | Beschreibung |
|---|---|---|---|
std::advance(it, n) |
Iterator um n Schritte vorwärts bewegen | advance(it, 2); |
Verändert den ursprünglichen Iterator |
std::distance(a, b) |
Abstand zwischen zwei Iteratoren berechnen | distance(v.begin(), v.end()); |
Gibt die Anzahl der Elemente zurück |
std::next(it, n) |
Gibt einen neuen Iterator zurück, der um n Schritte vorgerückt ist | auto it2 = next(it, 2); |
Empfohlen, verändert den ursprünglichen Wert nicht |
std::prev(it, n) |
Gibt einen neuen Iterator zurück, der um n Schritte zurückbewegt wurde | auto it2 = prev(it, 1); |
Unterstützt seit C++11 |
Iterator-Adapter (sehr wichtig)
Iterator-Adapter können das Verhalten von Iteratoren ändern, um sie an verschiedene Verwendungsszenarien anzupassen.
| Adapter | Funktion | Beispiel |
|---|---|---|
std::back_inserter |
Einfügen am Ende (Aufruf von push_back) | back_inserter(vec) |
std::front_inserter |
Einfügen am Anfang (Aufruf von push_front) | front_inserter(list) |
std::inserter |
An der angegebenen Position einfügen | inserter(vec, it) |
Stream-Iteratoren (ein Segen zur Vereinfachung von IO)
| Type | Funktion | Beispiel |
|---|---|---|
std::istream_iterator |
Daten aus dem Eingabestream lesen | istream_iterator<int>(cin) |
std::ostream_iterator |
In den Ausgabestream schreiben | ostream_iterator<int>(cout, " ") |
Iterator-Syntax
Die Syntax von Iteratoren sieht üblicherweise wie folgt aus:
#include <iterator>
// 使用迭代器遍历容器
for (ContainerType::iterator it = container.begin(); it != container.end(); ++it) {
// 访问元素 *it
}
Beispiel
Nachfolgend ein Beispiel unter Verwendung von<iterator>Header-Dateien und Iterator-Durchlaufstd::vectorBeispiel:
Beispiel
#include <vector>
#include <iterator>
#include <algorithm>
int main() {
// Einen Vektor-Container erstellen und initialisieren
std::vector<int> vec = {1, 2, 3, 4, 5};
// Den Vektor mit Iteratoren durchlaufen
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// Verwenden Sie das Schlüsselwort auto, um Iteratortypen zu vereinfachen
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// Verwenden Sie die bereichsbasierte for-Schleife in C++11
for (int elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
// Verwenden Sie back_inserter für automatisches Einfügen
std::vector<int> v2;
std::fill_n(std::back_inserter(v2), 3, 100);
// Verwenden Sie ostream_iterator für die Ausgabe
std::copy(v2.begin(), v2.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
Ausgabe:
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 100 100 100
Zusammenfassung
<iterator>Die Kernfunktionen lassen sich in drei Punkten zusammenfassen:
- Einheitliche Zugriffsmethode: Verschiedene Container verwenden dieselbe Traversierungslogik.
- Entkopplung von Containern und Algorithmen: Algorithmen hängen nur von Iteratoren ab.
- Verbesserte Wiederverwendbarkeit des Codes: Derselbe Codeabschnitt kann auf mehrere Datenstrukturen angewendet werden.
Für Anfänger wird empfohlen, vorrangig Folgendes zu beherrschen:
next / prev / distanceback_inserter- Iterator-Traversierungsmethode