Spec-Zone.ru › C++

std::ranges::views::slide, std::ranges::slide_view

Определено в заголовке <ranges>
template< ranges::forward_range V >
    requires ranges::view<V>
class slide_view
    : public ranges::view_interface<slide_view<V>>
(1) (с C++23)
namespace views {
    inline constexpr /* unspecified */ slide = /* unspecified */;
}
(2) (с C++23)
Подпись вызова
template< ranges::viewable_range R >
constexpr ranges::view auto slide( R&& r, ranges::range_difference_t<R> n );
(с C++23)
template< class DifferenceType >
constexpr /* range adaptor object */ slide( DifferenceType&& n );
(с C++23)
Вспомогательные концепции
template< class V >
concept __slide_caches_nothing =
    ranges::random_access_range<V> && ranges::sized_range<V>;
(3) (только для демонстрации*)
template< class V >
concept __slide_caches_last =
    !__slide_caches_nothing<V> &&
    ranges::bidirectional_range<V> && ranges::common_range<V>;
(4) (только для демонстрации*)
template< class V >
concept __slide_caches_first =
    !__slide_caches_nothing<V> && !__slide_caches_last<V>;
(5) (только для демонстрации*)
1) slide_view — это адаптер диапазонов, который принимает view и число n и генерирует представление, у которого m-ый элемент («окно») представляет собой представление, содержащее элементы с m-го по (m + n - 1)-й элементы исходного представления.
Пусть s — размер исходного представления. Тогда размер полученного представления:
  • s - n + 1, если s >= n,
  • ​0​ в противном случае, и полученное представление пустое.
2) Имя views::slide обозначает RangeAdaptorObject. Учитывая подвыражения e и n, выражение views::slide(e, n) эквивалентно выражению slide_view(e, n).

Если n не больше ​0​, поведение не определено.

slide_view всегда моделирует forward_range и моделирует двунаправленный диапазон, случайный доступный диапазон или размерный диапазон, если адаптированный view тип моделирует соответствующую концепцию.

Члены данных

Объект-член Определение
base_ (private) Базовое view типа V.
(только для демонстрации*)
n_ (private) Размер «окна» типа ranges::range_difference_t<V>.
(только для демонстрации*)
cached_begin_ (private)
(необязательно)
Объект-аналог необязательного объекта. Присутствует только если V моделирует __slide_caches_first (4).
(только для демонстрации*)
cached_end_ (private)
(необязательно)
Объект-аналог необязательного объекта. Присутствует только если V моделирует __slide_caches_last (5).
(только для демонстрации*)

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

(конструктор)
(C++23)
создаёт slide_view
(публичная функция-член)
begin
(C++23)
возвращает итератор в начало
(публичная функция-член)
end
(C++23)
возвращает итератор или стоп-значение в конец
(публичная функция-член)
size
(C++23)
возвращает количество элементов. Предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range.
(публичная функция-член)
Наследуется от 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)
возвращает последний элемент производного представления. Предоставляется, если оно удовлетворяет двунаправленному диапазону и common_range.
(публичная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-ый элемент производного представления. Предоставляется, если оно удовлетворяет случайному доступу.
(публичная функция-член std::ranges::view_interface<D>)

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

Вложенные классы

iterator
(C++23)
тип итератора
(только для демонстрации, шаблон класса-члена*)
sentinel
(C++23)
тип стоп-итератора, используемый, когда slide_view не является common_range
(только для демонстрации, шаблон класса-члена*)

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

template< class V >
inline constexpr bool ranges::enable_borrowed_range<slide_view<V>> =
    ranges::enable_borrowed_range<V>;
(с C++23)

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

Примечания

Существуют сходства между ranges::adjacent_view и ranges::slide_view:

  • Оба создают "скользящее окно" размера N.
  • Оба имеют одинаковый размер S - N + 1, где S — размер адаптированной view таким образом, что S >= N > 0.

Различия между этими адаптерами следующие:

Адаптер представления value_type Размер окна N
ranges::adjacent_view объект std::tuple параметр шаблона
ranges::slide_view range параметр во время выполнения
Макрос проверки наличия функции Значение Std Функция
__cpp_lib_ranges_slide 202202L (C++23) std::ranges::slide_view

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
 
auto print_subrange = [](std::ranges::viewable_range auto&& r)
{
    std::cout << '[';
    for (char space[]{0,0}; auto elem : r)
        std::cout << space << elem, *space = ' ';
    std::cout << "] ";
};
 
int main()
{
    const auto v = {1, 2, 3, 4, 5, 6};
 
    std::cout << "All sliding windows of width:\n";
    for (const unsigned width : std::views::iota(1U, 1U + v.size()))
    {
        auto const windows = v | std::views::slide(width);
        std::cout << "W = " << width << ": ";
        std::ranges::for_each(windows, print_subrange);
        std::cout << '\n';
    }
}

Вывод:

All sliding windows of width W:
W = 1: [1] [2] [3] [4] [5] [6] 
W = 2: [1 2] [2 3] [3 4] [4 5] [5 6] 
W = 3: [1 2 3] [2 3 4] [3 4 5] [4 5 6] 
W = 4: [1 2 3 4] [2 3 4 5] [3 4 5 6] 
W = 5: [1 2 3 4 5] [2 3 4 5 6] 
W = 6: [1 2 3 4 5 6]

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2023):
    • 26.7.29 Вид слайда [range.slide]

См. также

ranges::adjacent_viewviews::adjacent
(C++23)
view содержащий кортежи ссылок на смежные элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона)
ranges::chunk_viewviews::chunk
(C++23)
диапазон view, состоящий из кусков последовательных элементов без перекрытия размера N из другого view
(шаблон класса) (объект адаптера диапазона)

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

Spec-Zone.ru

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