Spec-Zone.ru › C++

Именованные требования 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)).

Стандартная библиотека

Следующие итераторы стандартной библиотеки являются выходными итераторами, которые не являются итераторами прямого доступа:

ostream_iterator
выходной итератор, выполняющий запись в std::basic_ostream
(шаблон класса)
ostreambuf_iterator
выходной итератор, выполняющий запись в std::basic_streambuf
(шаблон класса)
insert_iterator
адаптер итератора для вставки в контейнер
(шаблон класса)
back_insert_iterator
адаптер итератора для вставки в конец контейнера
(шаблон класса)
front_insert_iterator
адаптер итератора для вставки в начало контейнера
(шаблон класса)

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/OutputIterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API