C++ 具名要求:老式输出迭代器 (LegacyOutputIterator)
老式输出迭代器 (LegacyOutputIterator) 是能写入所指向元素的老式迭代器 (LegacyIterator) 。
一个实现老式输出迭代器 (LegacyOutputIterator) 的类型的例子是 std::ostream_iterator。
当老式向前迭代器 (LegacyForwardIterator) 、老式双向迭代器 (LegacyBidirectionalIterator) 或老式随机访问迭代器 (LegacyRandomAccessIterator) 在自身的要求之外还满足老式输出迭代器 (LegacyOutputIterator) 的要求时,它即被描述为可变的(mutable)。
要求
以下情况下,类型 X
满足老式输出迭代器 (LegacyOutputIterator)
- 类型
X
满足老式迭代器 (LegacyIterator) -
X
是类类型或指针类型
且,给定
-
o
,是输出迭代器对应的可写入类型的值(可以有多种可写入的类型,例如operator=
是模板的情况。并没有像输入迭代器的value_type
那种记号) -
r
,为X
类型的左值,
则下列表达式必须合法且拥有其指定的效果
表达式 | 返回 | 等价表达式 | 前条件 | 后条件 | 注解 |
---|---|---|---|---|---|
*r = o | (不使用) | r 可解引用
|
r 可自增
|
在此操作后不要求 r 可解引用,且不再要求任何 r 的先前值的副本可解引用或可自增。
| |
++r | X& | r 可自增
|
r 与 ++r 指代同一迭代器对象,r 可解引用或为末尾后迭代器
|
在此操作后不要求 r 可自增,且不再要求任何 r 的先前值的副本可解引用或可自增。
| |
r++ | 可转换到 const X& | X temp = r; ++r; |
|||
*r++ = o | (不使用) | *r = o; ++r; |
注解
operator*
对于输出迭代器的仅有的合法用法是在赋值的左侧:operator*
可以返回一个代理对象,它定义了成员 operator=
(可以是模板)
可以不对输出迭代器定义相等和不相等。即使定义了 operator==
,x == y
也不需要隐含 ++x == ++y
。
通过输出迭代器的同一值进行的赋值只会发生一次:输出迭代器上的算法必须是单趟算法。
预期通过输出迭代器的赋值与自增交替进行。双重自增是未定义行为(C++ 标准当前声称双重自增得到支持,这与 STL 文档相反;此为 LWG2035)
允许纯粹仅支持输出的迭代器声明其 iterator_traits<X>::value_type
、iterator_traits<X>::difference_type
、iterator_traits<X>::pointer
与 iterator_traits<X>::reference
为 void(如 std::back_insert_iterator 这样的迭代器正如此)。
标准库
下列的标准库迭代器是输出迭代器而非向前迭代器:
- std::ostream_iterator
- std::ostreambuf_iterator
- std::insert_iterator
- std::back_insert_iterator
- std::front_insert_iterator
参阅
(C++20) |
指定类型为给定的值类型的输出迭代器,即可向其写入该类型的值,且可前/后自增 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器及工具函数 |