Namespaces
Variants

C++ named requirements: LegacyForwardIterator

From cppreference.net
C++ named requirements

LegacyForwardIterator — это LegacyIterator , который может читать данные из указываемого элемента.

В отличие от LegacyInputIterator и LegacyOutputIterator , его можно использовать в многопроходных алгоритмах.

Если LegacyForwardIterator it происходит из Container , то его тип значения совпадает с типом значения контейнера, поэтому разыменование ( * it ) дает тип значения контейнера.

Содержание

Требования

Тип Определение
X Тип прямого итератора
T Тип значения для X (т.е. std:: iterator_traits < X > :: value_type )
Ref std:: iterator_traits < X > :: reference
Значение Определение
i , j Значения типа X или const X
r Значение типа X&

X удовлетворяет требованиям LegacyForwardIterator если выполняются все следующие условия:

  • X удовлетворяет требованиям LegacyInputIterator .
  • X удовлетворяет требованиям DefaultConstructible .
  • Если X является изменяемым итератором , Ref представляет собой ссылку на T .
  • Если X является константным итератором, Ref представляет собой ссылку на const T .
  • Объекты типа X обеспечивают гарантию многопроходности .
  • Если i и j равны, то либо оба i и j являются разыменуемыми , либо ни один из них не является разыменуемым.
  • Если i и j оба разыменуемы, то i == j тогда и только тогда, когда * i и * j связаны с одним и тем же объектом.
  • Следующие выражения должны быть корректными и иметь указанные эффекты:
Выражение Тип Эффекты
r ++ преобразуемо в const X & Эквивалентно X x = r ;
++ r ;
return x ;
.
* i ++ Ref

Домен равенства

Область определения для == для forward итераторов — это итераторы над одной и той же базовой последовательностью .

Однако, value-initialized forward iterators могут быть сравнены и должны быть равны другим value-initialized итераторам того же типа.

Другими словами, value-initialized forward iterators ведут себя так, как если бы они указывали за конец той же пустой последовательности.

(since C++14)

Гарантия многопроходности

Два разыменуемых итератора a и b типа X обеспечивают гарантию многопроходности при выполнении всех следующих условий:

  • a == b подразумевает ++ a == ++ b .
  • Выполняется любое из следующих условий:
  • X является типом указателя.
  • Выражение ( void ) ++ X ( a ) , * a эквивалентно выражению * a .

Концепт

Для определения std::iterator_traits определяется следующий концепт, используемый только для демонстрации.

template < class It >

concept __LegacyForwardIterator =
__LegacyInputIterator < It > && std:: constructible_from < It > &&
std:: is_reference_v < std:: iter_reference_t < It >> &&
std:: same_as <
std:: remove_cvref_t < std:: iter_reference_t < It >> ,
typename std:: indirectly_readable_traits < It > :: value_type > &&
requires ( It it ) {
{ it ++ } - > std:: convertible_to < const It & > ;
{ * it ++ } - > std:: same_as < std:: iter_reference_t < It >> ;

} ;

где концепт, используемый только для демонстрации, __LegacyInputIterator<T> описан в LegacyInputIterator .

(начиная с C++20)

Примечания

В отличие от концепции std::forward_iterator , требования LegacyForwardIterator обязывают разыменование возвращать ссылку.

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 1212
( N3066 )
C++98 тип выражения * i ++ не соответствовал типу
* i -- требуемому LegacyBidirectionalIterator
изменен
тип на Ref
LWG 1311
( N3066 )
C++98 « a == b подразумевает ++ a == ++ b » само по себе
не гарантировало многопроходность [1]
также требует « a == b
подразумевает ++ a ! = b » [2]
LWG 3798 C++20 __LegacyForwardIterator требовал
std:: iter_reference_t < It > быть ссылочным типом lvalue
также разрешает
ссылочные типы rvalue
  1. В сценарии, где a и b используют один и тот же базовый итератор, вычисление выражения ++ a == ++ b фактически дважды инкрементирует базовый контейнер, но результат всё равно равен true .
  2. Формально также требует подразумевать ++ b ! = a .

Смотрите также

определяет, что input_iterator является прямым итератором, поддерживающим сравнение на равенство и многопроходность
(концепт)
Библиотека итераторов предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций