C++ 命名要求: LegacyOutputIterator
一个 LegacyOutputIterator 是一个 LegacyIterator,它可以写入指向的元素。
一个实现 LegacyOutputIterator 的类型示例是 std::ostream_iterator。
当 LegacyForwardIterator、LegacyBidirectionalIterator 或 LegacyRandomAccessIterator 除了自身要求外还满足 LegacyOutputIterator 要求时,则将其描述为 **可变** 的。
内容 |
[编辑] 要求
类型 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 文档相反;这是一个 LWG 问题 2035)。
纯输出迭代器允许将其 iterator_traits<X>::value_type、iterator_traits<X>::difference_type、iterator_traits<X>::pointer 和 iterator_traits<X>::reference 声明为 void(并且诸如 std::back_insert_iterator 之类的迭代器确实如此 除了 difference_type
,它现在被定义为满足 std::output_iterator (自 C++20 起))。
[编辑] 标准库
以下标准库迭代器是输出迭代器,而不是正向迭代器
- std::ostream_iterator
- std::ostreambuf_iterator
- std::insert_iterator
- std::back_insert_iterator
- std::front_insert_iterator
[编辑] 参见
(C++20) |
指定类型是给定值类型的输出迭代器,也就是说,可以向其写入该类型的值,并且它可以进行前递增和后递增 (概念) |
迭代器库 | 提供迭代器、迭代器特征、适配器和实用程序函数的定义 |