大量变量,没有嵌套循环的最佳方法

时间:2019-05-22 09:31:57

标签: c++ nested-loops cartesian-product

我需要一些有关代码设计的帮助和指导。我想运行将多个变量设置为多个值的测试,而又不创建大量的嵌套循环。我得到了一个结构,其中包含这样的各种变量(仅以三个整数为例,但是真正的交易将包含更多的值,包括布尔值,双精度型等):

struct VarHolder
{
    int a;
    int b;
    int c;
    // etc..
    // etc..
};

该结构传递到测试函数中。

bool TestFunction(const VarHolder& _varholder)
{
    // ...
}

我想对所有在其设定范围内的变量以及所有变量组合进行测试。一种方法是为每个变量创建一个循环:

for (int a = 0; a < 100; a++)
{
  for (int b = 10; b < 90; b++)
    {
      for (int c = 5; c < 65; c++)
        {
          //...
          //...

             //set variables
             VarHolder my_varholder(a, b, c /*, ...*/);
             TestFunction(my_varholder);
        }
    }
}

但是,这似乎效率低下,并且随着变量数量的增加而变得难以理解。有什么优雅的方法可以做到这一点?一个症结是变量将来会更改,删除一些变量,添加新变量等。因此,最好在不重写每个变量的情况下采用一些解决方案。

1 个答案:

答案 0 :(得分:6)

使用range-v3,您可以使用cartesian_product视图:

auto as = ranges::view::ints(0, 100);
auto bs = ranges::view::ints(10, 90);
auto cs = ranges::view::ints(5, 65);
// ...
// might be other thing that `int`

for (const auto& t : ranges::view::cartesian_product(as, bs, cs /*, ...*/))
{
    std::apply(
        [](const auto&... args) {
            VarHolder my_varHolder{args...};
            Test(my_varHolder);
        },
        t);
}