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

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

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

Итератор
Потоковый Ввод/Вывод
Форматтеры
(C++20)
Случайные Числа
(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 больше не обязаны быть разыменовываемыми или инкрементируемыми.
++rX&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 предоставляет определения для итераторов, свойств итераторов, адаптеров и служебных функций.
close