Именованные требования C++: LegacyOutputIterator
LegacyOutputIterator — это LegacyIterator, который может записывать данные в элемент, на который указывает.
Примером типа, реализующего LegacyOutputIterator, является std::ostream_iterator.
Если LegacyForwardIterator, LegacyBidirectionalIterator или LegacyRandomAccessIterator удовлетворяет требованиям LegacyOutputIterator в дополнение к собственным требованиям, он называется изменяемым.
Требования
Тип 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::basic_ostream (шаблон класса) |
|
выходной итератор, выполняющий запись в std::basic_streambuf (шаблон класса) |
|
| адаптер итератора для вставки в контейнер (шаблон класса) |
|
| адаптер итератора для вставки в конец контейнера (шаблон класса) |
|
| адаптер итератора для вставки в начало контейнера (шаблон класса) |
См. также
|
(C++20) | указывает, что тип является выходным итератором для заданного типа значения, то есть значения этого типа можно записывать через него, а сам он поддерживает как преинкремент, так и постинкремент (концепт) |
| Библиотека итераторов | предоставляет определения итераторов, характеристик итераторов, адаптеров и вспомогательных функций |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/OutputIterator