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) |
view с обратным порядком.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 (общедоступная функция-член) |
|
(C++20) | возвращает базовый вид V (общедоступная функция-член) |
|
(C++20) | возвращает итератор начала reverse_view (общедоступная функция-член) |
|
(C++20) | возвращает итератор конца reverse_view (общедоступная функция-член) |
|
(C++20) | возвращает размер вида, если он ограничен (общедоступная функция-член) |
Унаследовано от |
|
|
(C++20) | возвращает, пуст ли производный вид. Предоставляется, если он удовлетворяет sized_range или forward_range. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает константный итератор начала диапазона. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает границу константного итератора диапазона. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает, не пуст ли производный вид. Предоставляется, если к нему применимо ranges::empty (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент производного вида. Предоставляется, если он удовлетворяет forward_range. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент производного вида. Предоставляется, если он удовлетворяет bidirectional_range и common_range. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(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) |
base_ по умолчанию (= V()).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) |
Возвращает базовый вид.
return base_;.return std::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) |
std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))). Для обеспечения амортизированной постоянной сложности времени, требуемой концепцией range, эта функция кэширует результат внутри объекта кэша для использования в последующих вызовах.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) |
Возвращает размер представления, если представление ограничено.
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 если его базовое представление таково |
См. также
| адаптер итераторов для обратного обхода (шаблон класса) |
|
|
(C++20) | меняет порядок элементов в диапазоне (niebloid) |
|
(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