【问题标题】:Lots of variables, best approach without nested loops很多变量,没有嵌套循环的最佳方法
【发布时间】:2019-10-08 18:05:36
【问题描述】:

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

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

但这似乎效率低下,并且随着变量数量的增加而变得不可读。实现这一目标的优雅方法是什么?一个关键是变量将来会发生变化,删除一些,添加新的等等。所以在每个变量发生变化时不为每个变量重写循环的解决方案是可取的。

【问题讨论】:

  • 为什么要标记为 java/c#/c++?对于 c# -> 你应该检查reflection
  • 一种优雅的方法是将您的大型结构重构为更小的逻辑单元,而不是拥有一个庞大的类/结构,其成员之间存在一些难以理解的依赖关系。
  • 您可以创建范围,然后使用(或创建(如果在您的语言/库中不可用))笛卡尔积(视图)或这些范围。
  • Varholder 这个名字已经表明你没有真正考虑过你的设计。如果这是一个由大量成员组成的集合,而你不能给它起一个更好的名字,那么这就是你的实际问题
  • @JeroenvanLangen 我标记了多种语言,因为该问题不仅适用于一种特定语言。另一方面,我没有意识到有可用的特定于语言的函数,所以我将标签更改为仅 c++。谢谢。

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


【解决方案1】:

使用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);
}

【讨论】:

  • 这正是我想要的。 De 库还包含一些其他有趣的功能。
猜你喜欢
  • 2015-11-28
  • 2022-01-26
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2010-09-16
  • 2016-07-26
  • 1970-01-01
相关资源
最近更新 更多