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 | предоставляет определения для итераторов, свойств итераторов, адаптеров и служебных функций. |