Daily bit(e) C++. std::views::adjacent, std::views::pairwise
Добавлено 30 сентября 2026 в 16:48
Daily bit(e) C++ 127, представления «скользящего кортежа» в C++23 – std::views::adjacent и std::views::pairwise.

std::views::adjacent – это представление, похожее на std::views::slide; оно формирует скользящее окно поверх входного диапазона. Однако, в отличие от std::views::slide, который выдает поддиапазоны, std::views::adjacent выдает кортежи ссылок на элементы.
Как следствие, элементы std::views::adjacent можно распаковывать с помощью структурных привязок (structured bindings).
У std::views::adjacent<2> есть псевдоним – std::views::pairwise.
#include <ranges>
#include <vector>
#include <iostream>
std::vector<int> data{1,2,3,4,5};
// "скользящий кортеж" ссылок на элементы
for (std::tuple<int&,int&,int&> v : data | std::views::adjacent<3>)
{
// итерация по {1,2,3}, {2,3,4}, {3,4,5}
std::cout << std::get<0>(v) << " " << std::get<1>(v) << " " << std::get<2>(v) << "\n";
}
// распаковка с помощью структурной привязки
for (auto [first, second, third] : data | std::views::adjacent<3>)
{
// итерация по {1,2,3}, {2,3,4}, {3,4,5}
std::cout << first << " " << second << " " << third << "\n";
}
// у std::views::adjacent<2> есть псевдоним
for (auto [left, right] : data | std::views::pairwise)
{
// итерация по {1,2}, {2,3}, {3,4}, {4,5}
std::cout << left << " " << right << "\n";
}
