Namespaces
Variants

std:: forward_iterator

From cppreference.net
Iterator library
Iterator concepts
forward_iterator
(C++20)


Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定義於ヘッダ <iterator>
template < class I >

concept forward_iterator =
std:: input_iterator < I > &&
std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: forward_iterator_tag > &&
std:: incrementable < I > &&

std:: sentinel_for < I, I > ;
(C++20以降)

このコンセプトは、 std::input_iterator を改良し、 I std::incrementable もモデル化することを要求し(それによりマルチパスアルゴリズムに適したものとし)、同じ範囲に対する2つのイテレータが互いに比較可能であることを保証します。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Iterator concept determination, Semantic requirements, Notes, Example, See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 数値やリンクなどの書式も完全に保持しています

イテレータコンセプトの決定

この概念の定義は、説明専用のエイリアステンプレート /*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>);

関連項目

型が入力イテレータであること、つまり参照する値を読み取ることができ、前置および後置インクリメントが可能であることを指定する
(concept)
forward_iterator が双方向イテレータであり、後方への移動をサポートすることを指定する
(concept)