嗯,我真的很喜欢这个解决方案,在这里提供(抱歉,它没有被翻译成英语):
#define FOR(I,UPPERBND) for(int I = 0; I<int(UPPERBND); ++I)
主要思想是这样描述的:当我们谈论简单的迭代索引循环时,我们不需要去考虑它。然而,当我们使用for(;;)结构时-总是有三个步骤:初始化、结束条件检查、迭代。而对于这样一个简单的循环来说,这是一种过度设计,只需i:[0,n)即可。
我喜欢这个想法,我们希望用简单的方式写简单的东西。当你看到FOR(i,N)时-你只需知道没有什么特别的。当您看到for(;;)结构时-您必须更加小心,并看到它的所有三个部分。
这是那篇文章中的一个例子:
for (int iter=0
for (int c=0
for (int lv0=0
for (int lv1 = lv0+1
for (int d=0
nlRowScaling(weight)
nlBegin(NL_ROW)
nlCoefficient(mesh.cells.vertex(c, lv0)*3 + d, 1)
nlCoefficient(mesh.cells.vertex(c, lv1)*3 + d, -1)
nlEnd(NL_ROW)
}
[...]
}
成为一个:
FOR(iter, nb_iter) {
FOR(c, mesh.cells.nb())
FOR(lv0, 4)
for (int lv1 = lv0+1; lv1<4; lv1++)
FOR(d, 3) {
nlRowScaling(weight);
nlBegin(NL_ROW);
nlCoefficient(mesh.cells.vertex(c, lv0)*3 + d, 1);
nlCoefficient(mesh.cells.vertex(c, lv1)*3 + d, -1);
nlEnd(NL_ROW);
}
[...]
}
你看,你应该把注意力集中在哪里。