我有大量的3到6维C数组需要遍历。使用类似于boost::multi_array的更C++化的表示不是一个选项,因为这些数组通过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]);
有很多类似的情况,循环索引的范围不同,这使得代码变得非常丑陋,同时也更容易出错。如何为这样的多维数组构建迭代器呢?