1

所以我一直在尝试做一些代码简化,主要是因为我不太喜欢嵌套 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 个循环来重现相同的输出,但我要么没有得到正确的结果,要么我超出了数组。所以我想知道它可以做到吗?

4

1 回答 1

2

我不确定我是否会推荐它,但为了科学……你去吧。它给了我好的。这个想法很简单。您可以通过乘法将两个数字合二为一,然后通过除法和取模检索它们。

请记住确保不要在乘法时溢出。我还会留下一条说明,我没有检查是否正确选择了所有类型。例如,仅此一项就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;
}
于 2014-10-21T00:26:46.453 回答