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 文档相悖;这是 LWG issue 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::basic_ostream的输出迭代器 (类模板) | |
写入std::basic_streambuf的输出迭代器 (类模板) | |
用于在容器中插入的迭代器适配器 (类模板) | |
用于在容器末尾插入的迭代器适配器 (类模板) | |
用于在容器前端插入的迭代器适配器 (类模板) |
[编辑] 参阅
(C++20) |
指定类型是给定值类型的输出迭代器,即该类型的值可以写入其中,并且可以进行前置和后置增量 (概念) |
迭代器库 | 为迭代器、迭代器特性、适配器和实用函数提供定义 |