Я реализую довольно сложный код, и в одном из критических разделов мне нужно в основном рассмотреть все возможные строки чисел, следуя определенному правилу.Наивной реализацией для объяснения того, что я делаю, была бы такая реализация вложенного цикла:
std::array<int,3> max = { 3, 4, 6};
for(int i = 0; i <= max.at(0); ++i){
for(int j = 0; j <= max.at(1); ++j){
for(int k = 0; k <= max.at(2); ++k){
DoSomething(i, j, k);
}
}
}
Очевидно, что мне действительно нужно больше вложенных элементов, а правило "max" более сложное, но идея ясна, я думаю.Я реализовал эту идею, используя рекурсивный подход:
std::array<int,3> max = { 3, 4, 6};
std::array<int,3> index = {0, 0, 0};
int total_depth = 3;
recursive_nested_for(0, index, max, total_depth);
, где
void recursive_nested_for(int depth, std::array<int,3>& index,
std::array<int,3>& max, int total_depth)
{
if(depth != total_depth){
for(int i = 0; i <= max.at(depth); ++i){
index.at(depth) = i;
recursive_nested_for(depth+1, index, max, total_depth);
}
}
else
DoSomething(index);
}
Чтобы максимально сохранить, я объявляю все переменные, которые я использую, глобальными в реальном коде.
Поскольку эта часть кода занимает очень много времени, можно ли что-нибудь сделать, чтобы ускорить ее?Я также был бы открыт, чтобы написать 24 вложенных для, если необходимо, по крайней мере, избежать накладных расходов!Я подумал, что, возможно, такой подход, как шаблоны выражений для генерации во время компиляции, для которого они вложены, может быть более элегантным.Но возможно ли это?Любое предложение будет с благодарностью.Спасибо всем.