C++ именованные требования:LegacyOutputIterator
LegacyOutputIterator Это LegacyIterator, который может писать в указанный элемент.
Пример типа, реализующего LegacyOutputIterator это std::ostream_iterator.
Когда LegacyForwardIterator, LegacyBidirectionalIterator, или LegacyRandomAccessIterator удовлетворяет LegacyOutputIterator требованию, помимо его собственных требований он описывается как mutable.
Содержание |
[править]Требования
Тип 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 больше не обязаны быть разыменовываемыми или инкрементируемыми. | |
r++ | возможно преобрование к const X& | X temp = r; ++r; | |||
*r++= o | (not used) | *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 делают именно это за исключением difference_type
, который теперь определен как std::output_iterator(начиная с C++20)).
[править]Стандартная библиотека
Следующие итераторы стандартной библиотеки являются выходными итераторами и не являются итераторами прямого прохода:
- std::ostream_iterator
- std::ostreambuf_iterator
- std::insert_iterator
- std::back_insert_iterator
- std::front_insert_iterator
[править]Смотри также
(C++20) | указывает, что тип является итератором вывода для данного типа значения, то есть в него могут быть записаны значения этого типа, и он может быть как пре-, так и пост-инкрементирован (концепт) |
Iterator library | предоставляет определения для итераторов, свойств итераторов, адаптеров и служебных функций. |