Re: [問題] 另一種方式的動態配置二維陣列…
※ 引述《ychch (GG)》之銘言:
: → ychch:感謝你的解釋…雖然看不太懂…但我會在想看看@@ 06/22 22:32
唉~~小弟我不太擅長在BBS上畫圖, 本來實在很懶得回的....Orz
傳統new一個二維陣列的作法大概如下....
int W = 16, H = 16;
char **p = new char*[H];
for(int i=0; i<H; ++i)
p[i] = new char[W];
for(int i=0; i<H; ++i)
delete []p[i];
delete []p;
這樣做的問題是, 你的p[][]陣列有可能是不連續的....
連不連續依運用未必是要考慮的問題, 我只是先提一個可能性....
下面用一張簡圖表示, 因為小弟實在不擅長BBS畫圖....
p: |---- ---- ---- ----|
| | | +---> p[3]: |---- ----|
| | +---> p[2]: |---- ----|
| +---> p[1]: |---- ----|
+---> p[0]: |---- ----|
用一個一維陣列模擬二維陣列的作法大概如下....
char **p = new char*[H];
char *raw = new char[W*H];
for(int i=0; i<H; ++i)
p[i] = &raw[i*W];
delete []p;
delete []raw;
這樣做, 至少可以保證你的p[][]也就是raw[]是連續的....
還方便一點, 不需要空間關係的循序操作您可以對raw[]直接做....
而它的記憶體分布情形大概簡圖如下....
p: |---- ---- ---- ----|
| | | |
| | | +--------------+
| | | |
| | +---------+ |
| | | |
| +----+ | |
| | | |
raw:|---- ---- ---- ---- ---- ---- ---- ----|
而您找到的那種寫法, 恕小弟不再貼code了....
它的簡圖大概像這樣, 我畫一畫意思有到就行了....
因為有交叉太麻煩畫了, 請您自己試著連連看吧....
連完您就知道理論上沒有空間被浪費掉的....
p: | (這一段放p[i]) (這一段相當於上面的raw) |
|---- ---- ---- ----|---- ---- ---- ---- ---- ---- ---- ----|
| |
最後一個寫法比前一個稍微好一點的地方是....
它只需要new/delete一次, 所有空間都是連續的....
想用二維陣列的操作模式就直接用p[i][j]....
想用一維模式就存取p[H]以後的範圍, 當然可能要加個轉型....
或者乾脆另外用一個變數 char *P = (char*)p[H]; 這樣:)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.41.18.64
※ 編輯: VictorTom 來自: 58.41.18.64 (06/22 23:00)
推
06/23 00:51, , 1F
06/23 00:51, 1F
→
06/23 00:51, , 2F
06/23 00:51, 2F
討論串 (同標題文章)