现在的位置: 首页 > 综合 > 正文

二维数组new小结

2014年11月15日 ⁄ 综合 ⁄ 共 1169字 ⁄ 字号 评论关闭

 

 是哦,四楼的有地方写错了,估计是笔误

我转发一个帖子,你看了就都明白了
发信人:   nichloas   (nil),   信区:   CPlusPlus
标     题:   [FAQ]二维数组new小结
发信站:   BBS   水木清华站   (Sat   Jun     7   15:27:42   2003),   转信
1.
        A   (*ga)[n]   =   new   A[m][n];
        ...
        delete   []ga;
缺点:n必须是已知
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)
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;
缺点:非连续储存,程序烦琐,ga为A**类型
优点:调用直观,n可以不是已知

3.     A*   ga   =   new   A[m*n];
        ...
        delete   []ga;
缺点:调用不够直观
优点:连续储存,n可以不是已知
4.     vector <vector <A>   >   ga;
        ga.resize(m);                                               //这三行可用可不用
        for(int   i   =   1;   i   <   n;   i++)                     //
                ga[i].resize(n);                                 //
        ...
缺点:非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)
优点:调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长
5.     vector <A>   ga;
        ga.resize(m*n);
方法3,4的结合
6.   2的改进版(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;
缺点:程序烦琐,ga为A**类型
优点:连续储存,调用直观,n可以不是已知
附:1,2,3,6还有对应的malloc-free版本
个人推荐1和4,2可以用4来代替,3,5调用太烦琐,毕竟源程序是拿来看的
不是拿来运行的
下面是一些错误和没成功的版本
1.   A*   ga   =   new   A[m][n];
    必然错误
2.   vector <A[n]>   ga;
      ga.resize(m);
      gcc   3.2下编译失败,不知道其它编译器效果如何
      也不知道标准是否允许

抱歉!评论已关闭.