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::basic_ostream 的输出迭代器 (类模板) | |
写入 std::basic_streambuf 的输出迭代器 (类模板) | |
用于插入到容器中的迭代器适配器 (类模板) | |
用于在容器末尾插入的迭代器适配器 (类模板) | |
用于在容器前端插入的迭代器适配器 (类模板) |
[编辑] 参见
(C++20) |
指定类型是给定值类型的输出迭代器,即,该类型的值可以写入到它,并且它可以进行前递增和后递增 (概念) |
迭代器库 | 提供迭代器、迭代器 traits、适配器和实用函数的定义 |