Spec-Zone.ru › C++

std::ranges::views::reverse, std::ranges::reverse_view

Определено в заголовочном файле <ranges>
template< ranges::view V >
    requires ranges::bidirectional_range<V>
class reverse_view
    : public ranges::view_interface<reverse_view<V>>
(1) (с C++20)
namespace views {
    inline constexpr /* unspecified */ reverse = /* unspecified */;
}
(2) (с C++20)
Вызов функции
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto reverse( R&& r );
(с C++20)
1) Адаптер диапазона, представляющий вид базового view с обратным порядком.
2)RangeAdaptorObject. Выражение views::reverse(e) эквивалентно одному из следующих выражений, за исключением того, что e вычисляется только один раз:
  • e.base(), если тип e является (возможно, с квалификаторами cv) специализацией reverse_view;
  • в противном случае, если тип e является (возможно, с квалификаторами cv) ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K> для некоторого типа итератора I и значения K типа ranges::subrange_kind:
    • ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), если K является ranges::subrange_kind::sized;
    • в противном случае ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
  • в противном случае ranges::reverse_view{e}.
Другими словами, views::reverse раскладывает обратные виды, если это возможно.

Адаптер reverse_view всегда моделирует bidirectional_range и common_range, а также моделирует borrowed_range, sized_range или random_access_range, если базовый тип вида V моделирует соответствующее понятие.

Члены-данные

Имя члена Определение
base_ (private) Базовый вид типа V.
(член-объект только для примера*)
cached_end_ (private) Объект-кеш, подобный некоторым типам, который содержит либо значение, либо итератор/позицию конца базового вида, который существует только в том случае, если базовый тип вида V не моделирует common_range.
(член-объект только для примера*)

Члены-функции

(конструктор)
(C++20)
создаёт reverse_view
(общедоступная функция-член)
base
(C++20)
возвращает базовый вид V
(общедоступная функция-член)
begin
(C++20)
возвращает итератор начала reverse_view
(общедоступная функция-член)
end
(C++20)
возвращает итератор конца reverse_view
(общедоступная функция-член)
size
(C++20)
возвращает размер вида, если он ограничен
(общедоступная функция-член)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, пуст ли производный вид. Предоставляется, если он удовлетворяет sized_range или forward_range.
(общедоступная функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор начала диапазона.
(общедоступная функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает границу константного итератора диапазона.
(общедоступная функция-член std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пуст ли производный вид. Предоставляется, если к нему применимо ranges::empty
(общедоступная функция-член std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент производного вида. Предоставляется, если он удовлетворяет forward_range.
(общедоступная функция-член std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент производного вида. Предоставляется, если он удовлетворяет bidirectional_range и common_range.
(общедоступная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-ый элемент производного вида. Предоставляется, если он удовлетворяет random_access_range.
(общедоступная функция-член std::ranges::view_interface<D>)

std::ranges::reverse_view::reverse_view

reverse_view() requires std::default_initializable<V> = default;
(1) (с C++20)
constexpr reverse_view( V r );
(2) (с C++20)
1) Инициализирует base_ по умолчанию (= V()).
2) Инициализирует base_ значением std::move(r).

Параметры

r - диапазон для переворота

std::ranges::reverse_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (с C++20)
constexpr V base() &&;
(2) (с C++20)

Возвращает базовый вид.

1) Копирует результат из базового вида. Эквивалентно return base_;.
2) Перемещает результат из базового вида. Эквивалентно return std::move(base_);.
END_OF_DOCUMENT_MARKER

std::ranges::reverse_view::begin

constexpr std::reverse_iterator<ranges::iterator_t<V>> begin();
(1) (с C++20)
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin()
    requires ranges::common_range<V>;
(2) (с C++20)
constexpr auto begin() const requires ranges::common_range<const V>;
(3) (с C++20)
1) Возвращает std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))). Для обеспечения амортизированной постоянной сложности времени, требуемой концепцией range, эта функция кэширует результат внутри объекта кэша для использования в последующих вызовах.
2,3) Эквивалентно return std::make_reverse_iterator(ranges::end(base_));.

std::ranges::reverse_view::end

constexpr std::reverse_iterator<ranges::iterator_t<V>> end();
(1) (с C++20)
constexpr auto end() const requires ranges::common_range<const V>;
(2) (с C++20)

Эквивалентно return std::make_reverse_iterator(ranges::begin(base_));.

std::ranges::reverse_view::size

constexpr auto size() requires ranges::sized_range<V>;
(1) (с C++20)
constexpr auto size() const requires ranges::sized_range<const V>;
(2) (с C++20)

Возвращает размер представления, если представление ограничено.

1,2) Эквивалентно return ranges::size(base_);.

Правила вывода типов

template< class R >
reverse_view( R&& ) -> reverse_view<views::all_t<R>>;
(с C++20)

Вспомогательные шаблоны

template< class T >
inline constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> =
    std::ranges::enable_borrowed_range<T>;
(с C++20)

Эта специализация std::ranges::enable_borrowed_range позволяет reverse_view удовлетворять borrowed_range, если базовое представление удовлетворяет этому условию.

Пример

#include <iostream>
#include <ranges>
 
int main()
{
    static constexpr auto il = {3, 1, 4, 1, 5, 9};
 
    std::ranges::reverse_view rv{il};
    for (int i : rv)
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : il | std::views::reverse)
        std::cout << i << ' ';
    std::cout << '\n';
 
    // operator[] is inherited from std::view_interface
    for (auto i{0U}; i != rv.size(); ++i)
        std::cout << rv[i] << ' ';
    std::cout << '\n';
}

Вывод:

9 5 1 4 1 3
9 5 1 4 1 3
9 5 1 4 1 3

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

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

DR Применено к Поведение, как опубликовано Правильное поведение
LWG 3494 C++20 reverse_view никогда не было borrowed_range это borrowed_range если его базовое представление таково

См. также

reverse_iterator
адаптер итераторов для обратного обхода
(шаблон класса)
ranges::reverse
(C++20)
меняет порядок элементов в диапазоне
(niebloid)
ranges::reverse_copy
(C++20)
создает копию диапазона, которая обращается в обратном порядке
(niebloid)

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

Spec-Zone.ru

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