std::forward_iterator
| ヘッダ <iterator> で定義 |
||
| template< class I > concept forward_iterator = |
(C++20以降) | |
このコンセプトは、I が std::incrementable もモデリングすることを要求することで std::input_iterator を改良し(これによりマルチパスアルゴリズムに適したものになります)、同じ範囲の2つのイテレータを互いに比較できることを保証します。
目次 |
[編集] イテレータコンセプトの決定
このコンセプトの定義は、展示専用のエイリアステンプレート /*ITER_CONCEPT*/ を介して指定されます。
/*ITER_CONCEPT*/<I> を決定するために、/*ITER_CONCEPT*/<I> を I とします。ただし、std::iterator_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> は型を表さず、置換失敗となります。
[編集] 意味要件
I は、それが包含するすべてのコンセプトをモデリングし、かつ、型 I のオブジェクト i および j が与えられた場合に、I が std::forward_iterator をモデリングするといいます。
- イテレータ
iとjの比較は、次の場合に定義された結果を持ちます。
-
iとjが同じ基底シーケンスのイテレータである場合。 または、
iとjの両方が値初期化されており、その場合、それらは等しく比較されます。
-
- 範囲に対するフォワードイテレータから取得されたポインタおよび参照は、範囲が存在する間は有効です。
iとjがデレファレンス可能である場合、それらは マルチパス保証 を提供します。つまり。
-
i == jは++i == ++jを意味し、 -
((void)[](auto x){ ++x; }(i), *i)は*iと同等です。
-
[編集] 注記
LegacyForwardIterator 要件とは異なり、forward_iterator コンセプトは、デリファレンスが参照を返すことを要求しません。
[編集] 例
最小限のフォワードイテレータ。
#include <cstddef> #include <iterator> struct SimpleForwardIterator { using difference_type = std::ptrdiff_t; using value_type = int; int operator*() const; SimpleForwardIterator& operator++(); SimpleForwardIterator operator++(int) { auto tmp = *this; ++*this; return tmp; } bool operator==(const SimpleForwardIterator&) const; }; static_assert(std::forward_iterator<SimpleForwardIterator>);
[編集] 関連項目
| (C++20) |
型が入力イテレータであること、すなわち、参照先の値を読み取ることができ、前置および後置インクリメントの両方が可能であることを規定する (コンセプト) |
| (C++20) |
forward_iterator は双方向イテレータであり、後方への移動をサポートすることを指定します。(コンセプト) |