C++ стандартные требования: LegacyOutputIterator
A 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 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) | определяет, что тип является выходным итератором для данного типа значения, т. е. значения этого типа могут быть записаны в него, и он может быть инкрементирован как до, так и после операции (концепция) |
| Библиотека итераторов | предоставляет определения для итераторов, свойств итераторов, адаптеров и служебных функций |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/OutputIterator