C ++我可以用1个循环替换嵌套的循环

时间:2014-10-20 23:57:27

标签: c++ for-loop nested-loops simplification

所以我一直在尝试进行一些代码简化,主要是因为我并不喜欢使用嵌套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 个答案:

答案 0 :(得分: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;
}