Пространства имён
Варианты
Действия

C++ именованные требования: LegacyOutputIterator

Материал из cppreference.com
< cpp‎ | named req
 
 
Именованные требования в C++
Основные
Свойства типа
В масштабах библиотеки
Контейнер
Элементы контейнера
(C++11)

Итератор
LegacyOutputIterator
Потоковый Ввод/Вывод
Форматтеры
(C++20)
Случайные Числа
(C++11)    
Конкуренция
(C++11)
(C++11)
Диапазоны
Другое
(C++11)


 

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

*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)).

[править] Стандартная библиотека

Следующие итераторы стандартной библиотеки являются выходными итераторами и не являются итераторами прямого прохода:

[править] Смотри также

указывает, что тип является итератором вывода для данного типа значения, то есть в него могут быть записаны значения этого типа, и он может быть как пре-, так и пост-инкрементирован
(концепт) [править]
Iterator library предоставляет определения для итераторов, свойств итераторов, адаптеров и служебных функций.