std:: forward_iterator
|
定义于头文件
<iterator>
|
||
|
template
<
class
I
>
concept forward_iterator
=
|
(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>);
参见
|
(C++20)
|
指定某个类型为输入迭代器,即其引用值可被读取且支持前置与后置递增操作
(概念) |
|
(C++20)
|
指定
forward_iterator
为双向迭代器,支持向后移动
(概念) |