很多变量,没有嵌套循环的最佳方法
Lots of variables, best approach without nested loops
我在代码设计方面需要一些帮助和指导。我想 运行 测试多个变量设置为多个值,而不创建疯狂数量的嵌套循环。我得到了一个包含各种变量的结构(仅举三个整数作为示例,但实际交易会包含更多变量,包括布尔值、双精度值等):
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);
}
}
}
但这似乎效率低下,并且随着变量数量的增加而变得难以阅读。实现这一目标的优雅方法是什么?一个症结是变量在未来会发生变化,删除一些,添加新的等等。所以一些解决方案而不是在每个变量发生变化时重写循环是更可取的。
使用 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);
}
我在代码设计方面需要一些帮助和指导。我想 运行 测试多个变量设置为多个值,而不创建疯狂数量的嵌套循环。我得到了一个包含各种变量的结构(仅举三个整数作为示例,但实际交易会包含更多变量,包括布尔值、双精度值等):
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);
}
}
}
但这似乎效率低下,并且随着变量数量的增加而变得难以阅读。实现这一目标的优雅方法是什么?一个症结是变量在未来会发生变化,删除一些,添加新的等等。所以一些解决方案而不是在每个变量发生变化时重写循环是更可取的。
使用 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);
}