Namespaces
Variants

C++ named requirements: LegacyOutputIterator

From cppreference.net
C++ named requirements

LegacyOutputIterator — это LegacyIterator , который может выполнять запись в указываемый элемент.

Пример типа, который реализует LegacyOutputIterator — это std::ostream_iterator .

Когда LegacyForwardIterator , LegacyBidirectionalIterator или LegacyRandomAccessIterator удовлетворяет требованиям LegacyOutputIterator в дополнение к своим собственным требованиям, он описывается как изменяемый (mutable).

Содержание

Требования

Тип X удовлетворяет требованиям LegacyOutputIterator если

  • Тип X удовлетворяет требованиям LegacyIterator
  • X является типом класса или типом указателя

И, учитывая

  • o , значение некоторого типа, которое может быть записано в выходной итератор (может существовать несколько типов, которые могут быть записаны, например, если operator = может быть шаблоном. Не существует понятия value_type как для входных итераторов)
  • r , lvalue типа 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
(шаблон класса)
адаптер итератора для вставки в контейнер
(шаблон класса)
адаптер итератора для вставки в конец контейнера
(шаблон класса)
адаптер итератора для вставки в начало контейнера
(шаблон класса)

Смотрите также

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