【发布时间】:2014-04-20 20:41:16
【问题描述】:
我有大量需要迭代的 3 到 6 维 C 数组。像 boost::multi_array 这样的更多 C++'y 表示不是一个选项,因为这些数组来自 C 框架 PETSc(使用 fortran 排序,因此向后索引)。简单的循环最终看起来像这样:
for (int i=range.ibeg; i<=range.iend; ++i){
for (int j=range.jbeg; j<=range.jend; ++j){
for (int k=range.kbeg; k<=range.kend; ++k){
(...)
甚至更糟:
for (int i=range.ibeg-1; i<=range.iend+1; ++i){
for (int j=range.jbeg-1; j<=range.jend+1; ++j){
for (int k=range.kbeg-1; k<=range.kend+1; ++k){
for (int ii=0; ii<Np1d; ++ii){
for (int jj=0; jj<Np1d; ++jj){
for (int kk=0; kk<Np1d; ++kk){
data[k][j][i].member[kk][jj][ii] =
func(otherdata[k][j][i].member[kk][jj][ii],
otherdata[k][j][i].member[kk][jj][ii+1]);
有很多这样的实例,循环索引的范围不同,这一切都变得非常丑陋并且可能容易出错。应该如何为这样的多维数组构造迭代器?
【问题讨论】:
-
光是看着就让人不寒而栗……
-
你和我都是,但这就是我生活的世界。
-
递归?在某些情况下,递归更胜一筹。如果你将它与模板结合起来,你甚至可以内联所有内容。
-
能举个代码例子吗?
-
你能把 Foo[X][Y][Z] 当作 Foo[XYZ] 对待吗?然后 foo[i][j][k] 变为 [i+jX+kX*Y]。或者这只是碰巧起作用并且不受标准保证的事情?
标签: c++ multidimensional-array iterator boost-iterators