Приблизительное пояснение - каждый дает свой способ разделения на окна.
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';
}
}