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 起)

此概念通过要求 I 同时满足 std::input_iterator std::incrementable (从而使其适用于多趟遍历算法),并保证指向同一范围的两个迭代器可相互比较,从而精化了输入迭代器概念。

目录

迭代器概念判定

此概念的定义通过仅用于展示的别名模板 /*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>);

参见

指定某个类型为输入迭代器,即其引用值可被读取且支持前置与后置递增操作
(概念)
指定 forward_iterator 为双向迭代器,支持向后移动
(概念)