0

我想要 3d 网格中连续(盒形)区域的单元格索引,即 3d set {iMin…iMax}×{jMin…jMax}×{kMin…kMax}。天真的方法是:

for(int i=iMin; i<=iMax; i++){
  for(int j=jMin; j<=jMax; j++){
    for(int k=kMin; k<=kMax; k++){
      // ...
    }
  }
}

没有嵌套循环,有没有更简洁的方法来做到这一点?

(我在 c++11 中,有一个Vector3i坐标类。我也可以使用任何 boost 库。)

4

2 回答 2

0

如果你想要一个循环,你可以这样做:

int main()
{
  size_t const N=8, M=N*N*N;
  size_t x(0), y(0), z(0);
  for (size_t i=0; i<M; ++i)
  {
    std::cout << x << ", " << y << ", " << z << std::endl;
    ++z;
    if (z == N)
    {
      z=0;
      ++y;
      if (y == N)
      {
        y=0;
        ++x;
      }
    }
  }
}

但是不要说我告诉过你它看起来不错!;)

于 2013-07-10T09:17:50.520 回答
0

一种方法是将你 3 个 fors 包装到算法 for_each_3d 中并传递给它一个 lambda,但它只适用于 3d 并且访问相邻元素会很痛苦。或者你可以使用 boost_mutli 数组和类似这样的循环: how to traverse a boost::multi_array 注意,multi_array 是一个数组,构造后不能调整大小

于 2013-07-10T08:37:48.340 回答