Spec-Zone.ru › C++

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

См. также

output_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

Spec-Zone.ru

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