Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无嵌套循环的连续三维网格遍历索引_C++_C++11_Grid_Traversal - Fatal编程技术网

C++ 无嵌套循环的连续三维网格遍历索引

C++ 无嵌套循环的连续三维网格遍历索引,c++,c++11,grid,traversal,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++){ // ... } } } for(int i=iMin;i一种方法是将您的3个fors包装到算法中,然后传递给它一个

我想要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++){
      // ...
    }
  }
}

for(int i=iMin;i一种方法是将您的3个fors包装到算法中,然后传递给它一个lambda,但它只适用于3d,访问相邻元素将是一件痛苦的事情。或者您可以使用类似于以下内容的boost_mutli数组和循环:

请注意,multi_array是一个数组,在构建后无法调整大小

如果您想要一个单循环,您可以选择以下方式:

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;
      }
    }
  }
}
intmain()
{
尺寸常数N=8,M=N*N*N;
尺寸x(0),y(0),z(0);

对于(size_t i=0;iAs contiguration不能完全保证通用性;我对此表示怀疑。三个循环可能比一个迭代变量和从该变量到坐标的精细映射算法更快(当然更清晰)。如果您控制
Vector3i
类,您可能会重载
运算符[]
如果您愿意的话。但是,嵌套循环有什么问题?这样,代码的每个读者都能清楚地知道您在做什么。
Vector3i
来自;它已经定义了
操作符[]
。嵌套循环需要三行,很容易输入错误。@Bathsheba:范围是连续的,我很确定。哇,这太难看了;)