Namensräume
Varianten
Aktionen

std::experimental::ranges::BidirectionalIterator

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Iterator-Bibliothek
Iterator-Konzepte
Indirekte aufrufbare Konzepte
                                                  
                                                  
                                                  
Gemeinsame Algorithmus-Anforderungen
                                                  
Konzept-Dienstprogramme
Iterator-Dienstprogramme und -Operationen
Iterator-Traits
Iterator-Adapter
Stream-Iteratoren
 
Definiert in Header <experimental/ranges/iterator>
template< class I >

concept bool BidirectionalIterator =
    ForwardIterator<I> &&
    DerivedFrom<ranges::iterator_category_t<I>, ranges::bidirectional_iterator_tag> &&
    requires(I i) {
        { --i } -> Same<I>&;
        { i-- } -> Same<I>&&;

    };
(Ranges TS)

Das Konzept BidirectionalIterator<I> verfeinert ForwardIterator um die Möglichkeit, einen Iterator rückwärts zu bewegen.

Ein bidirektionaler Iterator r wird als dekrementierbar bezeichnet, wenn und nur wenn ein s existiert, so dass ++s == r. Alle dekrementierbaren Iteratoren r müssen im Definitionsbereich der Ausdrücke --r und r-- liegen.

Seien a und b dekrementierbare Objekte vom Typ I. BidirectionalIterator<I> ist nur dann erfüllt, wenn

  • Die Prä-Dekrementierung einen L-Wert liefert, der auf den Operanden verweist: std::addressof(--a) == std::addressof(a).
  • Die Post-Dekrementierung liefert den vorherigen Wert des Operanden: Wenn bool(a == b) gilt, dann gilt bool(a-- == b).
  • Post-Dekrementierung und Prä-Dekrementierung modifizieren ihren Operanden auf die gleiche Weise: Wenn bool(a == b) gilt, dann gilt nach der Auswertung von sowohl a-- als auch --b immer noch bool(a == b).
  • Inkrement und Dekrement sind inverse Operationen zueinander
  • Wenn a inkrementierbar ist und bool(a == b) gilt, dann gilt bool(--(++a) == b).
  • Wenn bool(a == b) gilt, dann gilt bool(++(--a) == b).

[bearbeiten] Gleichheitserhaltung

Ein Ausdruck ist gleichheitserhaltend, wenn er bei gleichen Eingaben gleiche Ausgaben liefert.

  • Die Eingaben für einen Ausdruck bestehen aus seinen Operanden.
  • Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen von dem Ausdruck modifizierten Operanden (falls vorhanden).

Jeder Ausdruck, der gleichheitserhaltend sein muss, muss außerdem stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, solange keine explizite zwischenzeitliche Modifikation dieser Eingabeobjekte erfolgt.

Sofern nicht anders angegeben, muss jeder in einem requires-expression verwendete Ausdruck gleichheitserhaltend und stabil sein, und die Auswertung des Ausdrucks darf nur seine nicht-konstanten Operanden modifizieren. Operanden, die konstant sind, dürfen nicht modifiziert werden.