std::bidirectional_iterator
| ヘッダ <iterator> で定義 |
||
| template< class I > concept bidirectional_iterator = |
(C++20以降) | |
bidirectional_iterator コンセプトは、イテレータを後方に移動する能力を追加することで、forward_iterator を拡張します。
目次 |
[編集] イテレータコンセプトの決定
このコンセプトの定義は、展示専用のエイリアステンプレート /*ITER_CONCEPT*/ を介して指定されます。
/*ITER_CONCEPT*/<I> を決定するために、特殊化 std::iterator_traits<I> がプライマリテンプレートから生成されている場合は ITER_TRAITS<I> を I とし、それ以外の場合は ITER_TRAITS<I> を std::iterator_traits<I> とします。
- ITER_TRAITS<I>::iterator_concept が有効で型名を指定する場合、/*ITER_CONCEPT*/<I> はその型を表します。
- そうでなければ、ITER_TRAITS<I>::iterator_category が有効で型名を指定する場合、/*ITER_CONCEPT*/<I> はその型を表します。
- そうでなければ、std::iterator_traits<I> がプライマリテンプレートから生成される場合、/*ITER_CONCEPT*/<I> は std::random_access_iterator_tag を表します。
- そうでなければ、/*ITER_CONCEPT*/<I> は型を表さず、置換失敗となります。
[編集] 意味要件
双方向イテレータ r は、ある s が存在して ++s == r となるとき、デクリメント可能であると言います。
std::bidirectional_iterator<I> は、それが包含するすべてのコンセプトがモデル化されており、かつ型 I の 2 つのオブジェクト a と b が与えられている場合にのみモデル化されます。
aがデクリメント可能である場合、aは式 --a および a-- の定義域にあります。- 前置デクリメントはオペランドを参照する左辺値を返します: std::addressof(--a) == std::addressof(a)。
- 後置デクリメントはオペランドの以前の値を返します: bool(a == b) の場合、bool(a-- == b)。
- 後置デクリメントと前置デクリメントは、オペランドに対して同じ変更を行います: bool(a == b) の場合、
a--と--bの両方を評価した後も、bool(a == b) は成り立ちます。 - インクリメントとデクリメントは互いに逆演算です。
aがインクリメント可能で bool(a == b) の場合、bool(--(++a) == b)。aがデクリメント可能で bool(a == b) の場合、bool(++(--a) == b)。
[編集] 等価性保持
標準ライブラリのコンセプトのrequires式で宣言された式は、(特に明記されていない限り)等価性保持である必要があります。
[編集] 注記
LegacyBidirectionalIterator 要件とは異なり、bidirectional_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>);
[編集] 関連項目
| (C++20) |
input_iterator が、等価比較とマルチパスをサポートする前方イテレータであることを規定する(コンセプト) |
| (C++20) |
定数時間での前進と添字アクセスをサポートするランダムアクセス イテレータであることを指定します。 (コンセプト) |