Namespaces
Variants

std::experimental::ranges:: BidirectionalIterator

From cppreference.net
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> erweitert ForwardIterator durch die Fähigkeit, einen Iterator rückwärts zu bewegen.

Ein bidirektionaler Iterator r wird als dekrementierbar bezeichnet genau dann, 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:

  • Prä-Dekrement liefert einen L-Wert, der auf den Operanden verweist: std:: addressof ( -- a ) == std:: addressof ( a ) .
  • Post-Dekrement liefert den vorherigen Wert des Operanden: wenn bool ( a == b ) , dann bool ( a -- == b ) .
  • Post-Dekrement und Prä-Dekrement führen die gleiche Modifikation an ihrem Operanden durch: Wenn bool ( a == b ) , dann gilt nach Auswertung von sowohl a -- als auch -- b , bool ( a == b ) weiterhin.
  • Inkrement und Dekrement sind zueinander invers:
  • Wenn a inkrementierbar ist und bool ( a == b ) , dann bool ( -- ( ++ a ) == b ) .
  • Wenn bool ( a == b ) , dann bool ( ++ ( -- a ) == b ) .

Gleichheitserhaltung

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

  • Die Eingaben eines Ausdrucks bestehen aus seinen Operanden.
  • Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen durch den Ausdruck modifizierten Operanden (falls vorhanden).

Jeder Ausdruck, der gleichungserhaltend sein muss, muss darüber hinaus stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, sofern keine explizite Änderung dieser Eingabeobjekte zwischen den Auswertungen erfolgt.

Sofern nicht anders angegeben, muss jeder Ausdruck, der in einem requires-expression verwendet wird, 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.