Iteratoren

Die STL-Funktionen machen sich diese Verwendung von Iteratoren, mit verschiedenen den Algorithmen und Sequenzen zu übergeben, von denen sie ausgeführt werden. Der Name eines Iteratortyps (oder seinen Präfixes) gibt der Kategorie von Iteratoren an, die für diesen Typ benötigt werden. In der Reihenfolge des Machtzuwachses werden die Kategorien wie folgt zusammengefasst:

  • Ausgabe. Ein Ausgabeiterator X kann ein gespeichertes indirektes des Werts V darauf nur haben, nach muss er vor dem nächsten, als Speicher in erhöht werden (++ *X= V), (*X = V, eine X) oder (*X = V, X++).

  • Eingabe. Ein Eingabeiterator X kann einen Singularnamen Wert darstellen, der das Ende einer Sequenz angibt. Wenn ein Eingabeiterator ungleich den Ende-vonSequenzwert vergleicht, kann er ein zugreifen indirektes des Werts V darauf beliebig oft, als in haben (V = *X). Umso dem folgenden Wert oder Ende der Sequenz angehalten, erhöhen Sie es, wie in einem X, X(++ oder V = *X++). Sobald Sie alle Kopien eines Eingabeiterators erhöhen, können keine der anderen Kopien sicher verglichen werden dereferenziert werden, oder später erhöht werden.

  • vorwärts. Ein Vorwärtsiterator X kann eines Ausgabeiterators zum Schreiben oder des Eingabeiterators zum Lesen stattfinden. Sie können jedoch durch Lesen ( V =X) * (was Sie nur durch *X = V) durch einen Vorwärtsiterator schreiben. Sie können mehrere Kopien eines Vorwärtsiterator auch erstellen, die beide unabhängig dereferenziert werden und erhöht werden kann.

  • Bidirektional. Ein bidirektionalem Iterator X kann eines Vorwärtsiterators stattfinden. Sie können jedoch einen bidirektionalen Iterator auch dekrementieren, wie in --X, X--, or (V = *X--).

  • Wahlfreier Zugriff. Ein Iterator mit wahlfreier Zugriff X kann eine bidirektionale Iterators stattfinden. Sie können zahlreiche dieselbe ganzzahlige arithmetischen auf ein Iterator mit wahlfreier Zugriff ausführen, dass Sie an einem Objektzeiger können. Für N ein Ganzzahlfeld Objekt, können Sie x[N], x + N, x schreiben - N und N + X.

Beachten Sie, dass ein Iterators Objektzeiger eines mit wahlfreier Zugriff oder eines beliebigen anderen Iterators stattfinden kann. Alle Iteratoren können zugewiesen werden oder kopiert werden. Sie wird angenommen, um einfache Objekte sein und werden oft von Wert, nicht als Verweis übergeben und zurückgegeben. Beachten Sie auch, dass keine der Operationen, die beschriebenen, eine Ausnahme auslösen können, wenn sie von einem gültigen Iterator ausgeführt werden.

Die Hierarchie von Iteratorkategorien kann zusammengefasst werden, indem Sie drei Sequenzen anzeigt. Für lesegeschützten Zugriff auf eine Sequenz, können Sie eine aus verwenden:

output iterator
   -> forward iterator
   -> bidirectional iterator
   -> random-access iterator

Das bedeutet des Pfeils rechten "Dies kann durch Folgendes ersetzt werden." Jeder Algorithmus, der für einen Ausgabeiterator aufruft, sollte mit einem Vorwärtsiterator beispielsweise nicht jedoch der anderen Methode freundlich arbeiten umgekehrt.

Für schreibgeschützten Zugriff zu einer Sequenz, können Sie eine aus verwenden:

input iterator
   -> forward iterator
   -> bidirectional iterator
   -> random-access iterator

Ein Eingabeiterator ist aller Kategorien, in diesem Fall das schwächste.

Schließlich für Lese-/Schreibzugriff auf eine Sequenz, können Sie eine aus verwenden:

forward iterator
   -> bidirectional iterator
   -> random-access iterator

Ein Objektzeiger kann als Iterator mit wahlfreier Zugriff immer dienen, sodass er als eine Kategorie Iterator dienen, wenn es den richtigen Lese-/Schreibzugriff zur Reihenfolge einhalten, die er festgelegt wird.

Ein Iterator Iterator als einen Objektzeiger muss die auszublendende Membertypen auch definieren, die von der Spezialisierung iterator_traits<Iterator> benötigt werden. Beachten Sie, dass diese Bedingungen erfüllt werden können, indem Iterator von der öffentlichen Basisklasse Iterator abgeleitet.

Diese "Algebra" von Iteratoren ist mit praktisch allen anderen in der Standardvorlagenbibliothek grundlegend. Es ist wichtig, die Versprechen und Einschränkungen jeder Iteratorkategorie zu verstehen, zu sehen, wie Iteratoren nach Container und Algorithmen in STL verwendet werden.

Hinweis

Sie können for each, in verwenden, um über STL-Auflistungen zu durchlaufen.Weitere Informationen finden Sie unter Eine STL-Auflistung mit der for-each-Klausel durchlaufen.

Visual C++ bietet jetzt überprüfen Iteratoren an und gedebuggt Iteratoren, um sicherzustellen, dass Sie nicht die Grenzen des Containers überschreiben. Weitere Informationen finden Sie unter Überprüfte Iteratoren und Unterstützung für Iteratordebugging.

Siehe auch

Referenz

Standardvorlagenbibliothek

Threadsicherheit in der C++-Standardbibliothek