Daily bit(e) C++. std::views::cartesian_product

Добавлено 17 августа 2026 в 05:42

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

Daily bit(e) C++

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

Пример на Compiler Explorer

Теги

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