C++ named requirements: 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 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)
|
指定类型为给定值类型的输出迭代器,即可以向其写入该类型的值,并且支持前置和后置递增操作
(concept) |
| 迭代器库 | 提供迭代器、迭代器特征、适配器及工具函数的定义 |