C++ named requirements: LegacyOutputIterator
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
;
|
|||
| * 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
(шаблон класса) |
|
|
адаптер итератора для вставки в контейнер
(шаблон класса) |
|
|
адаптер итератора для вставки в конец контейнера
(шаблон класса) |
|
|
адаптер итератора для вставки в начало контейнера
(шаблон класса) |
Смотрите также
|
(C++20)
|
определяет, что тип является выходным итератором для заданного типа значения, то есть значения этого типа могут быть записаны в него, и он может быть как пре-, так и постинкрементирован
(концепт) |
| Библиотека итераторов | предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций |