Namensräume
Varianten
Aktionen

std::bidirectional_iterator

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
bidirectional_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 bidirectional_iterator =
        std::forward_iterator<I> &&
        std::derived_from</*ITER_CONCEPT*/<I>, std::bidirectional_iterator_tag> &&
        requires(I i) {
            { --i } -> std::same_as<I&>;
            { i-- } -> std::same_as<I>;

        };
(seit C++20)

Das Konzept bidirectional_iterator verfeinert forward_iterator durch Hinzufügen der Möglichkeit, einen Iterator rückwärts zu bewegen.

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, bezeichne 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.

[bearbeiten] Semantische Anforderungen

Ein bidirektionaler Iterator r gilt als dekrementierbar, wenn und nur wenn ein s existiert, so dass ++s == r.

std::bidirectional_iterator<I> wird nur dann modelliert, wenn alle von ihm umfassten Konzepte modelliert werden und gegeben zwei Objekte a und b vom Typ I:

  • Wenn a dekrementierbar ist, dann ist a im Definitionsbereich der Ausdrücke --a und a--.
  • Die Prä-Dekrementierung ergibt einen L-Wert, der auf den Operanden verweist: std::addressof(--a) == std::addressof(a).
  • Die Post-Dekrementierung ergibt den vorherigen Wert des Operanden: Wenn bool(a == b), dann bool(a-- == b).
  • Post-Dekrementierung und Prä-Dekrementierung führen die gleiche Modifikation an ihrem Operanden durch: Wenn bool(a == b), dann gilt nach der Auswertung von sowohl a-- als auch --b weiterhin bool(a == b).
  • Inkrementierung und Dekrementierung sind inverse Operationen zueinander.
  • Wenn a inkrementierbar ist und bool(a == b), dann bool(--(++a) == b).
  • Wenn a dekrementierbar ist und bool(a == b), dann bool(++(--a) == b).

[bearbeiten] Gleichheitserhaltung

Ausdrücke, die in requires-Ausdrücken der Standardbibliothekskonzepte deklariert sind, müssen gleichheitserhaltend sein (sofern nicht anders angegeben).

[bearbeiten] Hinweise

Im Gegensatz zu den LegacyBidirectionalIterator-Anforderungen verlangt das Konzept bidirectional_iterator nicht, dass die Dereferenzierung einen L-Wert zurückgibt.

[bearbeiten] Beispiel

Ein minimaler bidirektionaler Iterator.

#include <cstddef>
#include <iterator>
 
struct SimpleBidiIterator
{
    using difference_type = std::ptrdiff_t;
    using value_type = int;
 
    int operator*() const;
 
    SimpleBidiIterator& operator++();
 
    SimpleBidiIterator operator++(int)
    {
        auto tmp = *this;
        ++*this;
        return tmp;
    }
 
    SimpleBidiIterator& operator--();
 
    SimpleBidiIterator operator--(int)
    {
        auto tmp = *this;
        --*this;
        return tmp;
    }
 
    bool operator==(const SimpleBidiIterator&) const;
};
 
static_assert(std::bidirectional_iterator<SimpleBidiIterator>);

[bearbeiten] Siehe auch

spezifiziert, dass ein input_iterator ein Vorwärtsiterator ist, der Gleichheitsvergleich und Multi-Pass unterstützt
(Konzept) [bearbeiten]
gibt an, dass ein bidirectional_iterator ein zufallszugriffsorientierter Iterator ist, der die Vorrückung in konstanter Zeit und die Subskription unterstützt.
(Konzept) [bearbeiten]