C++ 生成可变数量的嵌套 FOR 循环

标签 c++ templates c++20

我有一个包含元素 vector 的结构:

struct SomeStruct
{
    std::vector<Element> vec;
};

每个元素包含一个容器:

struct Element
{
    Container m_container;
};

vector 可以包含 3、4 或 5 个元素。这是有保证的。

如果有 3 个项目,则下一阶段包含一系列 3 个嵌套的 for 循环(见下文)。具有 4 个元素的 vector 需要 4 个循环、5 -> 5 个循环等。只会有 3、4 或 5 个循环。

我必须省略一些代码,但循环内的逻辑最终是将 double 相乘并计算最小值。因此,最内层循环需要访问先前循环中的局部变量。

for(const auto& x : vec[0].m_container)
{
    const double some_calc = some_func(x);

    for(const auto& y : vec[1].m_container)
    {
        const double some_calc_2 = some_func(y);

        for(const auto& z : vec[2].m_container)
        {
            const double some_calc_3 = some_func(z);

            // TODO need a way to generate 4th and 5th loops if required

            // Logic processing data from the 3 loops
            const double a_calculation = some_calc * some_calc_2 * some_calc_3;
            double a_min = some_calc;
            a_min = std::min(a_min, some_calc_2);
            a_min = std::min(a_min, some_calc_3);
        }
    }
}

有没有一种方法可以根据 vector 的大小自动/生成这些嵌套的 FOR 循环?我正在考虑这样的模板:

if(struct.vec.size() == 3)
{
    the_answer<3>(struct.vec);
}
else if(struct.vec.size() == 4)
{
    the_answer<4>(struct.vec);
}
else
{
    the_answer<5>(struct.vec);
}

最佳答案

大多数时候你可以用递归来解决这个问题。所以

void loop(int n,const vector<double>& vec, vector<double> outer_vars){
     if (n!=vec.size()){
         for(const auto& z : vec[n]){
             outer_vars.push_back(some_func(z));
             loop(n+1,vec,outer_vars);
         }
     }
}

关于C++ 生成可变数量的嵌套 FOR 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74091075/

相关文章:

c++ - 取消引用 50% 出界指针(数组的数组)

c++ - 您可以将一个宏作为参数提供给另一个宏,而不扩展初始宏吗?

c++ - 在没有模板参数的类模板中使用类名

php - Yii 框架从 Controller 传递变量到 View

c++ - 在 if constexpr 中使用带有参数包的概念时升级到 gcc 9 后出现编译错误

c++ - 共享库的 g++ 链接未编译

C++如何从复杂字符串中仅获取整数

c++ - "Nested"带括号的类模板参数推导 : GCC vs. clang

C++20 契约和未使用的变量

c++ - 将字符串存储在 constexpr 结构中