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.

Daily bit(e) C++

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";
}

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование