Namespaces
Variants

C++ named requirements: LegacyOutputIterator

From cppreference.net
C++ named requirements

一个 LegacyOutputIterator 是一种 LegacyIterator ,能够向所指向的元素执行写入操作。

一个实现了 LegacyOutputIterator 的类型示例是 std::ostream_iterator

LegacyForwardIterator LegacyBidirectionalIterator LegacyRandomAccessIterator 在满足自身要求的同时还满足 LegacyOutputIterator 的要求时,它被描述为 可变的

目录

要求

类型 X 满足 LegacyOutputIterator

并且,给定

  • 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 ;
return temp ;

* 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 写入数据的输出迭代器
(类模板)
用于向容器插入数据的迭代器适配器
(类模板)
用于向容器末端插入数据的迭代器适配器
(类模板)
用于向容器前端插入数据的迭代器适配器
(类模板)

参见

指定类型为给定值类型的输出迭代器,即可以向其写入该类型的值,并且支持前置和后置递增操作
(concept)
迭代器库 提供迭代器、迭代器特征、适配器及工具函数的定义