Ежедневный бит (е) 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 могут быть деконструированы с помощью структурированного связывания.
std::views::adjacent‹2› имеет псевдоним в std::views::pairwise.
#include <ranges> #include <vector> std::vector<int> data{1,2,3,4,5}; // "sliding tuple" of references to elements for (std::tuple<int&,int&,int&> v : data | std::views::adjacent<3>) { // iterate over {1,2,3}, {2,3,4}, {3,4,5} } // deconstructed using structured binding for (auto [first, second, third] : data | std::views::adjacent<3>) { // iterate over {1,2,3}, {2,3,4}, {3,4,5} } // std::views::adjacent<2> has an alias for (auto [left, right] : data | std::views::pairwise) { // iterate over {1,2}, {2,3}, {3,4}, {4,5} }