创建二维数组的几个方法

常规的创建方法:type T [n][n]式就不说了。(int array[n][n];)

首先介绍两个动态的创建方法,然后介绍一下C++标准的中使用STL的容器vector创建二维数组的方法。

1.
定义:
const int ROW = 3;
int   size = 5;
int   (*pi)[ROW] ;
    //第二维必须为常数
pi = new int[size][ROW];    // 即 int   (*pi)[ROW] = new int[size][ROW];

操作方法:
int   k = 0;
cout <<endl
   <<"pi : " <<ROW*size <<endl;
for ( i=0; i<ROW; ++i )
{
   for ( int j=0; j<size; ++j )
   {
    pi[i][j] = k++;//初始化
    cout <<setw(2) <<pi[i][j] <<' ';//输出
   }
   cout <<endl;
}

内存释放:
delete[] pi;

缺点: LOW必须是已知。即第二维必须为常数
优点: 调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)。


2.
定义:

int** p = new int*[size];
for ( i=0; i<size; ++i )
{
   p[i] = new int[size];
}
// int   **p   =   NULL,len = 5,i;  
// *p   =   new   int[3];  
// for(i = 0; i < len; i++)  
//         p[i]   =   new   int[len]; -->此法初始化?

操作方法:
cout <<endl
   <<"p : " <<size*size <<endl;
k = 0;
for ( i=0; i<size; ++i )
{
   for ( int j=0; j<size; ++j )
   {
    p[i][j] = k++;//初始化
    cout <<setw(2) <<p[i][j] <<' ';//输出
   }
   cout <<endl;
}

内存释放:
for ( i=0; i<size; ++i )
   delete[] p[i];
delete[] p;

缺点: 非连续储存,内存释放烦琐,双重指针。
优点: 调用直观,size可以不是已知

 


 

由于STL的容器都支持动态增长,可以随时使用vector.resize()来改变容器的容量,所以使用vector创建的数组就具有动态创建的特性。

3.
定义:

vector< vector<int> >    ivec( 10 );//指定行的数量

操作方法:
//初始化
vector< vector<int> >::iterator iiter = ivec.begin();
vector< int >::iterator    iter;

for ( int i=0; iiter!=ivec.end(); ++iiter )
{
   (*iiter).resize ( 10 );
   for ( iter=iiter->begin(); iter!=iiter->end(); ++iter )
   {
    *iter = i++;
   }
}
//输出
cout <<"ivec : " <<ivec.size() <<endl;
for ( ; iiter!=ivec.end(); ++iiter )
{
   for ( iter=iiter->begin(); iter!=iiter->end(); ++iter )
   {
    cout <<setw(2) <<*iter <<' ';
   }
   cout <<endl;
}

缺点: 非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)。
优点: 调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长。

还可以使用以下的定义指定二维数组的行数和列数:
vector< vector<int> >    ivec2( 10, vector<int>(10) );

 


 

除此以外,我还在网上看到过以下这样的二级数组的定义,但对于我个人来说,这些所谓的二维数组只是一些所谓的一维数组(我这里强调“所谓”,是想说明,无论是多少维的数组,内存的存储结构都是一维的线性存储,只是以我们人的逻辑,拿[ ]和[ ][ ]加以区分而已),所以只提供了解!

T* ga = new T[m*n];
...
delete []ga;

vector<T> ga;
ga.resize(m*n);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值