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:

  1. Eingabe-Iterator: Kann nur einzelne Leseoperationen ausführen, keine Schreiboperationen.
  2. Ausgabe-Iterator: Kann nur einzelne Schreiboperationen ausführen, keine Leseoperationen.
  3. Vorwärts-Iterator: Kann Lese- und Schreiboperationen ausführen und sich vorwärts bewegen.
  4. Bidirektionaler Iterator: Zusätzlich zu allen Operationen eines Vorwärts-Iterators kann er sich auch rückwärts bewegen.
  5. 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 &lt;iterator&gt;

// 使用迭代器遍历容器
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 <iostream>
#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 / distance
  • back_inserter
  • Iterator-Traversierungsmethode
Weitere Erweiterungen