std:: forward_iterator
|
定義於ヘッダ
<iterator>
|
||
|
template
<
class
I
>
concept forward_iterator
=
|
(C++20以降) | |
このコンセプトは、
std::input_iterator
を改良し、
I
が
std::incrementable
もモデル化することを要求し(それによりマルチパスアルゴリズムに適したものとし)、同じ範囲に対する2つのイテレータが互いに比較可能であることを保証します。
目次 |
イテレータコンセプトの決定
この概念の定義は、説明専用のエイリアステンプレート /*ITER_CONCEPT*/ によって指定されます。
/*ITER_CONCEPT*/ < I > を決定するために、 ITER_TRAITS < I > を以下のように定義する: 特殊化 std:: iterator_traits < I > がプライマリテンプレートから生成されている場合は 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
を表す。
(すなわち、 std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: forward_iterator_tag > は true と仮定される。) - それ以外の場合、 /*ITER_CONCEPT*/ < I > は型を表さず、置換失敗となる。
セマンティック要件
I
は、以下の条件を満たす場合に限り
std::forward_iterator
をモデル化する:
I
が包含する全ての概念をモデル化し、かつ型
I
のオブジェクト
i
および
j
が与えられたとき:
- イテレータ 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> class SimpleForwardIterator { public: using difference_type = std::ptrdiff_t; using value_type = int; SimpleForwardIterator(); SimpleForwardIterator(const SimpleForwardIterator&); SimpleForwardIterator& operator=(const SimpleForwardIterator&); 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)
|
型が入力イテレータであること、つまり参照する値を読み取ることができ、前置および後置インクリメントが可能であることを指定する
(concept) |
|
(C++20)
|
forward_iterator
が双方向イテレータであり、後方への移動をサポートすることを指定する
(concept) |