C++ 概念: OutputIterator
输出迭代器(OutputIterator)是能写入所指元素的迭代器(Iterator)。
实现输出迭代器(OutputIterator)的类型的例子是 std::ostream_iterator。
当向前迭代器(ForwardIterator)、双向迭代器(BidirectionalIterator)或随机访问迭代器(RandomAccessIterator)在自身的要求之上满足的输出迭代器(OutputIterator)要求时,它被描述为可变的。
目录 |
[编辑] 要求
类型 X 满足输出迭代器(OutputIterator),若
- 类型
X满足迭代器(Iterator) -
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 正是这么做的)。
[编辑] 标准库
下列的标准库迭代器是输出迭代器且非向前迭代器:
- std::ostream_iterator
- std::ostreambuf_iterator
- std::insert_iterator
- std::back_insert_iterator
- std::front_insert_iterator