std::forward_iterator
来自 cppreference.com
定义在头文件 <iterator> 中 |
||
template< class I > concept forward_iterator = |
(自 C++20 起) | |
此概念完善了 std::input_iterator,要求 I
也模拟 std::incrementable(从而使其适合多遍算法),并保证指向同一范围的两个迭代器可以相互比较。
内容 |
[编辑] 迭代器概念确定
此概念的定义通过仅供说明的别名模板 /*ITER_CONCEPT*/ 指定。
为了确定 /*ITER_CONCEPT*/<I>,让 ITER_TRAITS<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
模拟 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> 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 是一个双向迭代器,支持向后移动。(概念) |