發(fā)信人: nichloas (nil), 信區(qū): CPlusPlus
標(biāo) 題: [FAQ] 二維數(shù)組new小結(jié)
發(fā)信站: BBS 水木清華站 (Sat Jun 7 15:27:42 2003), 轉(zhuǎn)信
1.
A (*ga)[n] = new A[m][n];
...
delete []ga;
缺點(diǎn):n必須是已知
優(yōu)點(diǎn):調(diào)用直觀,連續(xù)儲(chǔ)存,程序簡(jiǎn)潔(經(jīng)過測(cè)試,析構(gòu)函數(shù)能正確調(diào)用)
2. A** ga = new A*[m];
for(int i = 0; i < m; i++)
ga[i] = new A[n];
...
for(int i = 0; i < m; i++)
delete []ga[i];
delete []ga;
缺點(diǎn):非連續(xù)儲(chǔ)存,程序煩瑣,ga為A**類型
優(yōu)點(diǎn):調(diào)用直觀,n可以不是已知
3. A* ga = new A[m*n];
...
delete []ga;
缺點(diǎn):調(diào)用不夠直觀
優(yōu)點(diǎn):連續(xù)儲(chǔ)存,n可以不是已知
4. vector<vector<A> > ga;
ga.resize(m); //這三行可用可不用
for(int i = 1; i < n; i++) //
ga[i].resize(n); //
...
缺點(diǎn):非連續(xù)儲(chǔ)存,調(diào)試不夠方便,編譯速度下降,程序膨脹(實(shí)際速度差別不大)
優(yōu)點(diǎn):調(diào)用直觀,自動(dòng)析構(gòu)與釋放內(nèi)存,可以調(diào)用stl相關(guān)函數(shù),動(dòng)態(tài)增長(zhǎng)
5. vector<A> ga;
ga.resize(m*n);
方法3,4的結(jié)合
6. 2的改進(jìn)版(Penrose提供,在此感謝)
A** ga = new A*[m];
ga[0] = new A[m*n];
for(int i = 1; i < m; i++)
ga[i] = ga[i-1]+n;
...
delete [] ga[0];
delete [] ga;
缺點(diǎn):程序煩瑣,ga為A**類型
優(yōu)點(diǎn):連續(xù)儲(chǔ)存,調(diào)用直觀,n可以不是已知
附:1,2,3,6還有對(duì)應(yīng)的malloc-free版本
個(gè)人推薦1和4,2可以用4來代替,3,5調(diào)用太煩瑣,畢竟源程序是拿來看的
不是拿來運(yùn)行的
下面是一些錯(cuò)誤和沒成功的版本
1. A* ga = new A[m][n];
必然錯(cuò)誤
2. vector<A[n]> ga;
ga.resize(m);
gcc 3.2下編譯失敗,不知道其它編譯器效果如何
也不知道標(biāo)準(zhǔn)是否允許
我知道的就這些,歡迎大家補(bǔ)充,指正
--
--
※ 來源:·BBS 水木清華站 smth.org·[FROM: 162.105.216.213]
※ 修改:·devilphoenix 于 Sep 5 18:10:57 修改本文·[FROM: 211.99.222.*]