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) Объект-адаптер диапазона. Выражение views::reverse(e) эквивалентно по выражению одному из следующих выражений, за исключением того, что e вычисляется только один раз:
  • e.base(), если тип e является специализацией reverse_view (возможно, с квалификаторами cv);
  • в противном случае, если тип e — это ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K> (возможно, с квалификаторами cv) для некоторого типа итератора 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 моделирует соответствующую концепцию.

Поля данных

Элемент Описание
V base_ (закрытый) базовое представление
(объект-член, предназначенный только для описания*)
non-propagating-cache<ranges::iterator_t<V>> cached_end_ (закрытый)
(присутствует, только если V не удовлетворяет common_range)
объект, кэширующий результат вызовов begin()
(объект-член, предназначенный только для описания*)

Функции-члены

(конструктор)
создаёт reverse_view
(открытая функция-член)
base
возвращает базовое представление V
(открытая функция-член)
begin
возвращает итератор начала reverse_view
(открытая функция-член)
end
возвращает итератор конца reverse_view
(открытая функция-член)
size
возвращает размер представления, если оно ограничено
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер базового approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; предоставляется, только если оно удовлетворяет 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
возвращает признак того, что производное представление не пусто; предоставляется, только если к нему применима ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется, только если оно удовлетворяет bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает элемент с индексом 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) Перемещающе конструирует результат из базового представления. Эквивалентно returnstd::move(base_ );.

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 амортизированную сложность O(1), эта функция кэширует результат в объекте кэша для использования при последующих вызовах.
2,3) Эквивалентно returnstd::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)

Эквивалентно returnstd::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)

Возвращает размер представления, если оно ограничено. Эквивалентно returnranges::size(base_ );.

std::ranges::as_rvalue_view::reserve_hint

constexpr auto reserve_hint()
    requires ranges::approximately_sized_range<V>;
(1) (начиная с C++26)
constexpr auto reserve_hint() const
    requires ranges::approximately_sized_range<const V>;
(2) (начиная с C++26)

Возвращает ranges::reserve_hint(base_ ).

Руководства по выводу типов

template< class R >
reverse_view( R&& ) -> reverse_view<views::all_t<R>>;
(начиная с C++20)

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

template< class T >
constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> =
    ranges::enable_borrowed_range<T>;
(начиная с C++20)

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

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range и reserve_hint

Пример

#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)
изменяет порядок элементов в диапазоне на обратный
(объект-функция алгоритма)
ranges::reverse_copy
(C++20)
создаёт копию диапазона с обратным порядком элементов
(объект-функция алгоритма)

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

Spec-Zone.ru

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