std::forward_iterator
| Definiert in Header <iterator> |
||
| template< class I > concept forward_iterator = |
(seit C++20) | |
Dieses Konzept verfeinert std::input_iterator, indem es verlangt, dass I auch std::incrementable modelliert (wodurch es für Mehrfachdurchlaufalgorithmen geeignet ist), und garantiert, dass zwei Iteratoren zu demselben Bereich miteinander verglichen werden können.
Inhalt |
[bearbeiten] Bestimmung des Iterator-Konzepts
Die Definition dieses Konzepts wird über ein expositions-only-Alias-Template /*ITER_CONCEPT*/ spezifiziert.
Um /*ITER_CONCEPT*/<I> zu bestimmen, sei ITER_TRAITS<I> I, wenn die Spezialisierung std::iterator_traits<I> aus der Primärvorlage generiert wird, oder std::iterator_traits<I> andernfalls.
- Wenn ITER_TRAITS<I>::iterator_concept gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/<I> diesen Typ.
- Andernfalls, wenn ITER_TRAITS<I>::iterator_category gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/<I> diesen Typ.
- Andernfalls, wenn std::iterator_traits<I> aus der primären Vorlage generiert wird, bezeichnet /*ITER_CONCEPT*/<I> std::random_access_iterator_tag.
- Andernfalls bezeichnet /*ITER_CONCEPT*/<I> keinen Typ und führt zu einem Substitutionsfehler.
[edit] Semantische Anforderungen
I modelliert std::forward_iterator, wenn und nur wenn I alle Konzepte modelliert, die es einschließt, und gegeben die Objekte i und j vom Typ I
- Der Vergleich zwischen den Iteratoren i und j hat ein definiertes Ergebnis, wenn
- i und j Iteratoren zu derselben zugrundeliegenden Sequenz sind, oder
- beide i und j wertinitialisiert sind, in welchem Fall sie gleich sind.
- Aus einem Forward-Iterator in einen Bereich erhaltene Zeiger und Referenzen bleiben gültig, solange der Bereich existiert.
- Wenn i und j dereferenzierbar sind, bieten sie die Multi-Pass-Garantie, das heißt
- i == j impliziert ++i == ++j, und
- ((void)[](auto x){ ++x; }(i), *i) ist äquivalent zu *i.
[edit] Hinweise
Im Gegensatz zu den LegacyForwardIterator-Anforderungen verlangt das forward_iterator-Konzept nicht, dass die Dereferenzierung eine Referenz zurückgibt.
[edit] Beispiel
Ein minimaler Forward-Iterator.
#include <cstddef> #include <iterator> struct SimpleForwardIterator { using difference_type = std::ptrdiff_t; using value_type = int; int operator*() const; SimpleForwardIterator& operator++(); SimpleForwardIterator operator++(int) { auto tmp = *this; ++*this; return tmp; } bool operator==(const SimpleForwardIterator&) const; }; static_assert(std::forward_iterator<SimpleForwardIterator>);
[edit] Siehe auch
| (C++20) |
spezifiziert, dass ein Typ ein Eingabeiterator ist, d. h. seine referenzierten Werte können gelesen werden und er kann sowohl prä- als auch post-inkrementiert werden (Konzept) |
| (C++20) |
spezifiziert, dass ein forward_iterator ein bidirektionaler Iterator ist und die Bewegung rückwärts unterstützt(Konzept) |