小弟在写程式时常会用到如下程式
for (int rows = 0; rows < arrayHeight; ++rows)
{
for (int cols = 0; cols < arrayWidth; ++cols)
{
// do something
}
}
利用两个循环来处理二维阵列的所有元素
但有时在处理某个元素时
会需要该元素周围的元素来计算
就会变成下面的情况
for (int rows = 0; rows < arrayHeight; ++rows)
{
for (int cols = 0; cols < arrayWidth; ++cols)
{
for (int rows2 = rows - 1; rows2 < rows + 2; ++rows2)
{
for (int col2 = col - 1; col2 < col + 2; ++col2)
{
// 边界判定
// do something
}
}
//dosomething
}
}
在这个情况下层数就会变得很多
使用function或许是其中一种方式,如
for (int rows = 0; rows < arrayHeight; ++rows)
{
for (int cols = 0; cols < arrayWidth; ++cols)
{
function1();
//do something
}
}
后来我想我明明只是要遍历所有元素
为何不能只写一个for就处理完
于是试着用define的写法来处理
#define RANGE(VALUE, BEGIN, END) \
int VALUE = BEGIN; VALUE < END; ++VALUE
#define FOR_2D(CONDITION_1, CONDITION_2) \
for (CONDITION_1) \
for (CONDITION_2)
于是我就能使用
FOR_2D(RANGE(rows, 0, arrayHeight), RANGE(cols, 0, arrayWidth))
{
// do something
}
来处理
对于上面需要再取某元素周围元素的计算也能用
FOR_2D(RANGE(rows, 0, arrayHeight), RANGE(cols, 0, arrayWidth))
{
FOR_2D(RANGE(row2, rows - 1, rows + 2), RANGE(col2, cols - 1, cols + 2))
{
//边界判定
//do something
}
// do something
}
我想讨论的问题如下
1.使用define的这种写法到底好还是不好 (或者该说优点跟缺点是?)
2.是否还有其它更好的方式可以处理这种双循环的问题(就是要遍历2维阵列中所有元素)
以上烦请大大们开示
define 不是也是一样会展开吗?我觉得一般写就好
楼主: dragon229 (Fuzzy) 2014-11-30 22:09:00
跑两步是指? 执行的顺序就是 cols = 0 rows = 0
楼主: dragon229 (Fuzzy) 2014-11-30 22:10:00
cols = 1 rows = 0, ... cols = 0 rows = 1...类推可读性变差是指? 因为不是语法的一部份吗?
楼主: dragon229 (Fuzzy) 2014-11-30 22:46:00
我可能没有表达好问题如果今天要用成4个循环的情况,不会觉得缩排太多造成程式码不好看吗?
作者:
CaptainH (Cannon)
2014-11-30 23:43:00美或丑很主观,但你这个很难改是肯定的想改个step value或在某层循环里加一行都难真有太多层缩排而看不清楚的情形,应该是拉出去写成函式,或用递回处理
干嘛一直盯着看后人怨声载道 只因为你现在想要好看你确定以后不会有人看到就随便你
作者:
xvid (DivX)
2014-12-01 03:55:00做好code format(缩排等) 加上易读的变量命名和充分的注解多层循环并不代表不好阿 或者do something的部份看是否能写函式呼叫 怎么修改自己考量
作者:
lmr3796 (Toro)
2014-12-01 14:01:00function call是比较佳的写法
作者:
dirkc (3781615)
2014-12-01 14:15:00inline+1,写或不写inline func.看那一段之后会不会常改或者重复call,以上例也可直接化为算式放在第二层内array[i-1~i+1][j-1~j+1] 如果情况许可,我自己是会思考是不是有类似dynamic programming或一些资料结构可以来加速个人经验,我想还是看设计师的喜好吧