C ++ Могу ли я заменить вложенный цикл с 1 цикла

Поэтому я пытался упростить код, в основном потому, что мне не очень нравятся циклы Nested For, но у меня возникают проблемы при попытке упростить приведенный ниже код. Код работает отлично и работает как задумано (код ниже урезан!).

int fill{200}, wid{600}, hei{400};
for (int w{ 0 }; w < fill; w++) {
for (int h{ 0 }; h < hei; h++) {
int offset{ w + h * (wid + fill) }
//Offset is used to traverse a 1d array "fill" amount of times.
/*Before:
000000
000000
000000
000000
After:
110000
110000
110000
110000*/
}
}

Я попытался воспроизвести тот же результат с на 1 циклом меньше, но я либо не получил правильный результат, либо выхожу за пределы массива. Вот мне и интересно, можно ли это сделать?

1

Решение

Я не уверен, рекомендую ли я это, но для науки … вот, пожалуйста. Это дает мне ОК. Идея проста. Вы объединяете два числа в одно с умножением и извлекаете их через деление и по модулю.

Просто помните, чтобы быть уверенным, чтобы не переполниться при умножении. Я также оставлю примечание, что я не проверял, правильно ли выбраны все типы. Например это одно int offset{ w + h * (wid + fill) }; поднимает мне флаг Поэтому приведенный ниже код предназначен только для математики / метода.

#include <iostream>
#include <vector>
using namespace std;

int main() {
std::vector<int> loop1, loop2;
int fill{200}, wid{600}, hei{400};

for (int w{ 0 }; w < fill; w++) {
for (int h{ 0 }; h < hei; h++) {
int offset{ w + h * (wid + fill) };
loop1.push_back(offset);
}
}

for (int i{ 0 }; i < fill*hei; i++) {
int w = i / hei;
int h = i % hei;
int offset{ w + h * (wid + fill) };
loop2.push_back(offset);
}

if (loop2 == loop1) cout << "OK\n";
else cout << "NOT OK\n";
return 0;
}
1

Другие решения


По вопросам рекламы [email protected]