[問題] 二維陣列型別

看板C_and_CPP作者 (屁孩)時間6年前 (2017/08/03 18:12), 6年前編輯推噓10(10020)
留言30則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Any 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 小弟平常要new一個二維陣列時,都是直接 auto A = new int[N][N]; 但是auto是C++11才開始支援的語法,若是無法使用auto型別時,該改成什麼? 編譯器給出的型別貌似是 int (*)[N] 但是寫成 int (*)[N] A = new int[N][N] 也是一樣無法編譯成功QQ 補充說明(Supplement): 小弟C/C++的基礎觀念有點差,若有些概念是錯的還請大家指正 -- Send from JPTT on my Google Glasses -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.96.141 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1501755140.A.FEC.html

08/03 18:43, , 1F
int[][]
08/03 18:43, 1F

08/03 18:44, , 2F
**ptr ?
08/03 18:44, 2F

08/03 19:57, , 3F
int(*A)[N] = new int[N][N];
08/03 19:57, 3F

08/03 19:58, , 4F
上面應該是你要的 配成靜態int A[10][10]
08/03 19:58, 4F

08/03 19:59, , 5F
也可以先做一個100的空間再切成二維陣列
08/03 19:59, 5F

08/03 20:00, , 6F
int (*A)[N]
08/03 20:00, 6F
恩恩,這樣就對了~謝謝大大,原來編譯器給的意思是這樣

08/03 22:38, , 7F
int** A = new int* [N] ; 然後再用迴圈對int* new 一
08/03 22:38, 7F

08/03 22:38, , 8F
維的dynamic array
08/03 22:38, 8F

08/04 01:28, , 9F
推樓上的用法
08/04 01:28, 9F

08/04 01:28, , 10F
但是記得delete的時候也要迴圈
08/04 01:28, 10F

08/04 01:28, , 11F
否則會造成memory fragment
08/04 01:28, 11F
這個做法我其實知道,不過感覺會多一個O(N)的時間

08/04 01:30, , 12F
其實這個case可以考慮用c++的list
08/04 01:30, 12F
其實我是在寫競賽的題目要存矩陣,然後要做一些矩陣的運算,所以感覺list好像不太行, 加上我記得STL的list常數有點大(ry

08/05 01:09, , 13F
如果你要講求效能的話可以這樣:
08/05 01:09, 13F

08/05 01:09, , 14F
int *ary = new int[sizeX * sizeY];
08/05 01:09, 14F

08/05 01:10, , 15F
ary[y*sizeX + x]
08/05 01:10, 15F
對耶,也可以這樣~謝謝大大

08/05 01:10, , 16F
但如果是團隊合作個人是不建議,一來不方便閱讀,
08/05 01:10, 16F

08/05 01:11, , 17F
二來,你的case有必要連這麼一點點時間都要爭取嗎?
08/05 01:11, 17F

08/05 01:13, , 18F
如果你很care時間的話,你還可以把上面第一個方法的迴圈
08/05 01:13, 18F

08/05 01:14, , 19F
步份,開執行緒進行初始化,但是我目前做到現在的case
08/05 01:14, 19F

08/05 01:14, , 20F
(我只是個小小的研究生跟著老闆在接外面的case)
08/05 01:14, 20F

08/05 01:15, , 21F
很少有情況,連那一點時間都要@@
08/05 01:15, 21F
其實一般現實狀況是應該不太會有這麼刁鑽的情況,不過競賽就(ry ※ 編輯: oToToT (180.177.96.141), 08/06/2017 13:17:32

08/06 23:47, , 22F
對了 剛剛上面那個ary[y*sizeX + x]在3維以上的陣列就會
08/06 23:47, 22F

08/06 23:47, , 23F
很複雜,所以不建議用在高維振烈
08/06 23:47, 23F

08/06 23:48, , 24F
08/06 23:48, 24F

08/06 23:48, , 25F
參考這篇
08/06 23:48, 25F

08/07 11:02, , 26F
我說的複雜是指
08/07 11:02, 26F

08/07 11:02, , 27F
你今天想把它從2*3*4改成6*5*7
08/07 11:02, 27F

08/07 11:02, , 28F
這種動態的改變size
08/07 11:02, 28F

08/07 18:53, , 29F
競賽用直接在global開一塊夠大的就好
08/07 18:53, 29F

08/07 23:51, , 30F
啊還有看起來你的N是常數 用tr1::array就行啦
08/07 23:51, 30F
文章代碼(AID): #1PWlS4_i (C_and_CPP)