[讨论] 2维阵列 使用循环的方式

楼主: dragon229 (Fuzzy)   2014-11-30 20:21:28
小弟在写程式时常会用到如下程式
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维阵列中所有元素)
以上烦请大大们开示
作者: iloveyouever (佚名)   2014-11-30 20:45:00
define 不是也是一样会展开吗?我觉得一般写就好
作者: MOONRAKER (㊣牛鹤鳗毛人)   2014-11-30 22:05:00
你跑步都一次跑两步吗
楼主: dragon229 (Fuzzy)   2014-11-30 22:09:00
跑两步是指? 执行的顺序就是 cols = 0 rows = 0
作者: lunasdejavu (我的头上长香菇了)   2014-11-30 22:09:00
程式可读性会变差吧 要给别人的话最好还是不要
楼主: dragon229 (Fuzzy)   2014-11-30 22:10:00
cols = 1 rows = 0, ... cols = 0 rows = 1...类推可读性变差是指? 因为不是语法的一部份吗?
作者: MOONRAKER (㊣牛鹤鳗毛人)   2014-11-30 22:17:00
不要在跑步这种最简单的事情上面变花样。
楼主: dragon229 (Fuzzy)   2014-11-30 22:46:00
我可能没有表达好问题如果今天要用成4个循环的情况,不会觉得缩排太多造成程式码不好看吗?
作者: CaptainH (Cannon)   2014-11-30 23:43:00
美或丑很主观,但你这个很难改是肯定的想改个step value或在某层循环里加一行都难真有太多层缩排而看不清楚的情形,应该是拉出去写成函式,或用递回处理
作者: MOONRAKER (㊣牛鹤鳗毛人)   2014-11-30 23:51:00
干嘛一直盯着看后人怨声载道 只因为你现在想要好看你确定以后不会有人看到就随便你
作者: xvid (DivX)   2014-12-01 03:55:00
做好code format(缩排等) 加上易读的变量命名和充分的注解多层循环并不代表不好阿 或者do something的部份看是否能写函式呼叫 怎么修改自己考量
作者: shadow0326 (非议)   2014-12-01 10:58:00
还不如用func call就好
作者: lmr3796 (Toro)   2014-12-01 14:01:00
function call是比较佳的写法
作者: dirkc (3781615)   2014-12-01 14:15:00
inline+1,写或不写inline func.看那一段之后会不会常改或者重复call,以上例也可直接化为算式放在第二层内array[i-1~i+1][j-1~j+1] 如果情况许可,我自己是会思考是不是有类似dynamic programming或一些资料结构可以来加速个人经验,我想还是看设计师的喜好吧

Links booklink

Contact Us: admin [ a t ] ucptt.com