Spec-Zone.ru › C++

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

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

Если LegacyRandomAccessIterator it происходит из Container, то it's 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 или const It
  • 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 контекстно преобразуется в bool Эквивалентно 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 контекстно преобразуется в bool b < a Полное отношение упорядочения, противоположное a < b
a >= b контекстно преобразуется в bool !(a < b)
a <= b контекстно преобразуется в bool !(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#Concept.

(с C++20)

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

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

DR Применимо к Поведение, как опубликовано Правильное поведение
LWG 299
(N3066)
C++98 тип возврата a[n] должен был преобразовываться в const value_type& тип возврата должен преобразовываться в reference
LWG 448 C++98 тип возврата a[n] должен был преобразовываться в value_type тип возврата должен преобразовываться в const value_type&[1]
LWG 1079 C++98 b - a определялось с использованием a < b,
приводило к циклическому определению
убрано a < b из определения
  1. LWG issue 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/w/cpp/named_req/RandomAccessIterator

Spec-Zone.ru

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