遍历没有嵌套循环的连续三维网格的索引

时间:2013-07-10 08:24:56

标签: c++ c++11 grid traversal

我想在3d网格中连续(盒形)区域区域的单元索引,即3d集{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坐标类。我也可以使用任何升级库。)

2 个答案:

答案 0 :(得分:0)

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

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

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