跳到主要内容

C++ 命名要求: LegacyOutputIterator

一个 LegacyOutputIterator 是一个可以写入所指向元素的 LegacyIterator

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

LegacyForwardIteratorLegacyBidirectionalIteratorLegacyRandomAccessIterator 除了自身要求之外还满足 LegacyOutputIterator 要求时,它被称为可变(mutable)。

要求

如果满足以下条件,类型 X 满足 LegacyOutputIterator

并且,给定

  • o,一个可以写入到输出迭代器的一些类型的值(可能有多种可写类型,例如,如果 operator= 可能是模板。没有像输入迭代器那样的 value_type 概念)
  • r,类型 X 的左值。以下表达式必须有效并具有其指定的效果
表达式返回等价表达式前置条件后置条件备注
*r = o(未使用)r 可解引用r 可递增此操作后,r 不再需要可解引用,且 r 之前值的任何副本不再需要可解引用或可递增。
++rX&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_typeiterator_traits<X>::difference_typeiterator_traits<X>::pointeriterator_traits<X>::reference 声明为 void(并且像 std::back_insert_iterator 这样的迭代器正是这样做的 除了 difference_type,它现在定义为满足 std::output_iterator (C++20 起))。

标准库

以下标准库迭代器是输出迭代器,但不是前向迭代器:

C++ 命名要求: LegacyOutputIterator

一个 LegacyOutputIterator 是一个可以写入所指向元素的 LegacyIterator

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

LegacyForwardIteratorLegacyBidirectionalIteratorLegacyRandomAccessIterator 除了自身要求之外还满足 LegacyOutputIterator 要求时,它被称为可变(mutable)。

要求

如果满足以下条件,类型 X 满足 LegacyOutputIterator

并且,给定

  • o,一个可以写入到输出迭代器的一些类型的值(可能有多种可写类型,例如,如果 operator= 可能是模板。没有像输入迭代器那样的 value_type 概念)
  • r,类型 X 的左值。以下表达式必须有效并具有其指定的效果
表达式返回等价表达式前置条件后置条件备注
*r = o(未使用)r 可解引用r 可递增此操作后,r 不再需要可解引用,且 r 之前值的任何副本不再需要可解引用或可递增。
++rX&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_typeiterator_traits<X>::difference_typeiterator_traits<X>::pointeriterator_traits<X>::reference 声明为 void(并且像 std::back_insert_iterator 这样的迭代器正是这样做的 除了 difference_type,它现在定义为满足 std::output_iterator (C++20 起))。

标准库

以下标准库迭代器是输出迭代器,但不是前向迭代器: