Ежедневный бит (е) C++ # 81, Представление n-арного декартова продукта C++ 23: std::views::cartesian_product

C++23 std::views::cartesian_product — это представление, представляющее n-арное декартово произведение содержимого представлений, переданных в качестве аргументов.

Один из вариантов использования std::views::cartesian_product — замена стандартных вложенных циклов for.

#include <ranges>
#include <vector>

struct Point {
    int x;
    int y;
};

auto dir = {-1,0,1};
Point p{5,5};

// Cartesian product representing the 3x3 grid around a center point.
for (auto [x,y] : std::views::cartesian_product(dir,dir)) {
    // Iterate over:
    // {4,4}, {4,5}, {4,6}, {5,4}, {5,5}, {5,6}, {6,4}, {6,5}, {6,6}
}

// Same but filter out diagonals and center point.
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));
    })) {
    // Iterate over: {4,5}, {5,4}, {5,6}, {6,5}
}

std::vector<char> a{'1','2'}, b{'a','b'}, c{'&','$'};
for (auto [i,j,k] : std::views::cartesian_product(a,b,c)) {
    // Iterate over:
    // 1a&, 1a$, 1b&, 1b$, 2a&, 2a$, 2b&, 2b$
}

Откройте пример в Compiler Explorer.