В чём разница между std::views::slide, std::views::chunk и std::views::adjacent?

Рейтинг: 1Ответов: 1Опубликовано: 25.03.2023

В чём разница между std::views::slide, std::views::chunk и std::views::adjacent? Все они позволяют итерироваться окнами по последовательности.

Ответы

▲ 2

Приблизительное пояснение - каждый дает свой способ разделения на окна.

slide просто дает окна нужного размера поочередно, с каждого очередного элемента начиная.
chunk просто режет на непересекающиеся окна нужного размера.
Ну, а adjacent нарезает не в диапазон, а в кортеж, с размером, заданным во время компиляции.

Вот, сравните первые два - коды из cppreference.com.

#include <algorithm>
#include <iostream>
#include <ranges>

auto print_subrange = [](std::ranges::viewable_range auto&& r) {
    std::cout << "[";

    for (int pos{}; auto elem : r)
        std::cout << (pos++ ? " " : "") << elem;

    std::cout << "] ";
    };

int main() {
    const auto v = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    for (const unsigned width : std::views::iota(1U, 1U + v.size())) {
        auto const windows = v | std::views::slide(width);
        std::cout << "All sliding windows of width " << width << ": ";
        std::ranges::for_each(windows, print_subrange);
        std::cout << '\n';
        }

    std::cout << "-------------------------------\n";

    for (const unsigned width : std::views::iota(1U, 2U + v.size())) {
        auto const chunks = v | std::views::chunk(width);
        std::cout << "chunk(" << width << "): ";
        std::ranges::for_each(chunks, print_subrange);
        std::cout << '\n';
        }
    }