作者dragon229 (Fuzzy)
看板C_and_CPP
標題[討論] 2維陣列 使用迴圈的方式
時間Sun Nov 30 20:21:28 2014
小弟在寫程式時常會用到如下程式
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維陣列中所有元素)
以上煩請大大們開示
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.184.17.80
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1417350091.A.B68.html
→ iloveyouever: define 不是也是一樣會展開嗎? 11/30 20:45
→ iloveyouever: 我覺得一般寫就好 11/30 20:46
→ MOONRAKER: 你跑步都一次跑兩步嗎 11/30 22:05
→ dragon229: 跑兩步是指? 執行的順序就是 cols = 0 rows = 0 11/30 22:09
推 lunasdejavu: 程式可讀性會變差吧 要給別人的話最好還是不要 11/30 22:09
→ dragon229: cols = 1 rows = 0, ... cols = 0 rows = 1...類推 11/30 22:10
→ dragon229: 可讀性變差是指? 因為不是語法的一部份嗎? 11/30 22:11
→ MOONRAKER: 不要在跑步這種最簡單的事情上面變花樣。 11/30 22:17
→ dragon229: 我可能沒有表達好問題 11/30 22:46
→ dragon229: 如果今天要用成4個迴圈的情況,不會覺得縮排太多 11/30 22:47
→ dragon229: 造成程式碼不好看嗎? 11/30 22:47
推 CaptainH: 美或醜很主觀,但你這個很難改是肯定的 11/30 23:43
→ CaptainH: 想改個step value或在某層迴圈裡加一行都難 11/30 23:44
推 CaptainH: 真有太多層縮排而看不清楚的情形,應該是拉出去寫成函 11/30 23:48
→ CaptainH: 式,或用遞迴處理 11/30 23:48
→ MOONRAKER: 幹嘛一直盯著看 11/30 23:51
→ MOONRAKER: 後人怨聲載道 只因為你現在想要好看 11/30 23:53
→ MOONRAKER: 你確定以後不會有人看到就隨便你 11/30 23:53
推 xvid: 做好code format(縮排等) 加上易讀的變數命名和充分的註解 12/01 03:55
→ xvid: 多層迴圈並不代表不好阿 或者do something的部份看是否能寫 12/01 03:57
→ xvid: 函式呼叫 怎麼修改自己考量 12/01 03:57
→ shadow0326: 還不如用func call就好 12/01 10:58
推 lmr3796: function call是比較佳的寫法 12/01 14:01
→ dirkc: inline+1,寫或不寫inline func.看那一段之後會不會常改或者 12/01 14:15
→ dirkc: 重複call,以上例也可直接化為算式放在第二層內 12/01 14:15
→ dirkc: array[i-1~i+1][j-1~j+1] 如果情況許可,我自己是會思考是 12/01 14:16
→ dirkc: 不是有類似dynamic programming或一些資料結構可以來加速 12/01 14:16
→ dirkc: 個人經驗,我想還是看設計師的喜好吧 12/01 14:17