std::bidirectional_iterator
| Definiert in Header <iterator> |
||
| template< class I > concept bidirectional_iterator = |
(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
adekrementierbar ist, dann istaim 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
ainkrementierbar ist und bool(a == b), dann bool(--(++a) == b). - Wenn
adekrementierbar ist und bool(a == b), dann bool(++(--a) == b).
- Wenn
[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
| (C++20) |
spezifiziert, dass ein input_iterator ein Vorwärtsiterator ist, der Gleichheitsvergleich und Multi-Pass unterstützt(Konzept) |
| (C++20) |
gibt an, dass ein bidirectional_iterator ein zufallszugriffsorientierter Iterator ist, der die Vorrückung in konstanter Zeit und die Subskription unterstützt.(Konzept) |