Namensräume
Varianten
Aktionen

std::forward_iterator

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
forward_iterator
(C++20)


Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Definiert in Header <iterator>
template< class I >

    concept forward_iterator =
        std::input_iterator<I> &&
        std::derived_from</*ITER_CONCEPT*/<I>, std::forward_iterator_tag> &&
        std::incrementable<I> &&

        std::sentinel_for<I, I>;
(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

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) [bearbeiten]
spezifiziert, dass ein forward_iterator ein bidirektionaler Iterator ist und die Bewegung rückwärts unterstützt
(Konzept) [bearbeiten]