Daily bit(e) C++. std::views::cartesian_product
Добавлено 17 августа 2026 в 05:42
Daily bit(e) C++ 81, представление n-арного декартова произведения в C++23: std::views::cartesian_product.

std::views::cartesian_product в C++23 – это представление n-арного декартова произведения содержимого представлений, переданных в качестве аргументов.
Один из вариантов использования std::views::cartesian_product – замена стандартных вложенных циклов for.
#include <ranges>
#include <vector>
#include <iostream>
struct Point
{
int x;
int y;
};
auto dir = {-1,0,1};
Point p{5,5};
// Декартово произведение, представляющее собой сетку 3x3
// вокруг центральной точки.
for (auto [x,y] : std::views::cartesian_product(dir,dir))
{
// Пройтись по:
// {4,4}, {4,5}, {4,6}, {5,4}, {5,5}, {5,6}, {6,4}, {6,5}, {6,6}
std::cout << (p.x + x) << "," << (p.y + y) << "\n";
}
// То же самое, но с исключением диагоналей и центральной точки.
for (auto [x,y] : std::views::cartesian_product(dir,dir) |
std::views::filter([](const auto& v) {
return std::abs(std::get<0>(v)) != std::abs(std::get<1>(v));
}))
{
// Пройтись по: {4,5}, {5,4}, {5,6}, {6,5}
std::cout << (p.x + x) << "," << (p.y + y) << "\n";
}
std::vector<char> a{'1','2'}, b{'a','b'}, c{'&','$'};
for (auto [i,j,k] : std::views::cartesian_product(a,b,c))
{
// Пройтись по:
// 1a&, 1a$, 1b&, 1b$, 2a&, 2a$, 2b&, 2b$
std::cout << i << j << k << "\n";
}
