Spec-Zone.ru › C++

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

LegacyRandomAccessIterator — это LegacyBidirectionalIterator, который можно переместить так, чтобы он указывал на любой элемент за постоянное время.

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

Указатель на элемент массива удовлетворяет всем требованиям LegacyRandomAccessIterator.

Требования

Тип It удовлетворяет требованиям LegacyRandomAccessIterator, если

  • Тип It удовлетворяет требованиям LegacyBidirectionalIterator

И, если заданы

  • value_type, тип, обозначаемый как std::iterator_traits<It>::value_type
  • difference_type, тип, обозначаемый как std::iterator_traits<It>::difference_type
  • reference, тип, обозначаемый как std::iterator_traits<It>::reference
  • i, a, b, объекты типа It или constIt
  • r, lvalue типа It
  • n, целое число типа difference_type

Следующие выражения должны быть допустимы и иметь указанные эффекты:

Выражение Тип возвращаемого значения Операционная семантика Примечания
r += n It& difference_type m = n; if (m >= 0) while (m--) ++r; else while (m++) --r; return r;
  • n может быть как положительным, так и отрицательным
  • Сложность постоянная (то есть реализация не может фактически выполнять цикл while, показанный в операционной семантике)
a + n

n + a

It It temp = a; return temp += n;
  • n может быть как положительным, так и отрицательным
  • a + n == n + a
r -= n It& return r += -n; Абсолютное значение n должно находиться в диапазоне представимых значений difference_type.
i - n It It temp = i; return temp -= n;
b - a difference_type return n;
(см. предусловие)

Предусловие:

  • существует значение n типа difference_type, такое что a + n == b

Постусловие:

  • b == a + (b - a).
i[n] преобразуемо в reference *(i + n)
a < b

удовлетворяет требованиям BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
Эквивалентно return b - a > 0; Предусловие:
  • то же, что и для b - a

Отношение строгого полного порядка:

  • !(a < a)
  • если a < b, то !(b < a)
  • если a < b и b < c, то a < c
  • a < b или b < a или a == b
    (истинно ровно одно из выражений)
a > b

удовлетворяет требованиям BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
b < a Отношение полного порядка, противоположное a < b
a >= b

удовлетворяет требованиям BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
!(a < b)
a <= b

удовлетворяет требованиям BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
!(a > b)

Из приведённых выше правил следует, что LegacyRandomAccessIterator также реализует LessThanComparable.

Изменяемый LegacyRandomAccessIterator — это LegacyRandomAccessIterator, который дополнительно удовлетворяет требованиям LegacyOutputIterator.

Концепт

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

template<class I>
concept __LegacyRandomAccessIterator =
    __LegacyBidirectionalIterator<I> && std::totally_ordered<I> &&
        requires(I i, typename std::incrementable_traits<I>::difference_type n)
        {
            { i += n } -> std::same_as<I&>;
            { i -= n } -> std::same_as<I&>;
            { i +  n } -> std::same_as<I>;
            { n +  i } -> std::same_as<I>;
            { i -  n } -> std::same_as<I>;
            { i -  i } -> std::same_as<decltype(n)>;
            {  i[n]  } -> std::convertible_to<std::iter_reference_t<I>>;
        };

где концепт __LegacyBidirectionalIterator, используемый только для описания, описан в разделе LegacyBidirectionalIterator.

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

Отчёты об ошибках

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

DR Применяется к Опубликованное поведение Корректное поведение
LWG 299
(N3066)
C++98 тип возвращаемого значения a[n] должен был
быть преобразуемым в constvalue_type&
тип возвращаемого значения должен
быть преобразуемым в reference
LWG 448 C++98 тип возвращаемого значения a[n] должен был
быть преобразуемым в value_type
тип возвращаемого значения должен быть
преобразуемым в constvalue_type&[1]
LWG 1079 C++98 b - a определялся с использованием a < b,
что приводило к циклическому определению
из определения удалено a < b
LWG 2114
(P2167R3)
C++98 преобразование в bool было недостаточным для отражения ожиданий реализаций требования усилены
  1. Предложение LWG 299 было повторно открыто после принятия этого решения.

См. также

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

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

Spec-Zone.ru

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