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
[编辑] 参阅
指定类型为给定值类型的输出迭代器,即能把该类型的值写入它,且它能前后自增 (概念) |