Spec-Zone.ru › C++

Именованные требования C++: LegacyForwardIterator

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

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

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

Требования

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

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

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

Область равенства

Область == для итераторов прямого прохода — это область итераторов, проходящих по одной и той же последовательности.

Однако итераторы прямого прохода, инициализированные значением, можно сравнивать; они должны быть равны другим итераторам того же типа, инициализированным значением.

Иными словами, итераторы прямого прохода, инициализированные значением, ведут себя так, как если бы они указывали за конец одной и той же пустой последовательности.

(начиная с 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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
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.

См. также

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

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

Spec-Zone.ru

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