Ежедневный бит (е) 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.