Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356554
  • 博文数量: 78
  • 博客积分: 2222
  • 博客等级: 大尉
  • 技术积分: 745
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-24 10:48
文章分类

全部博文(78)

文章存档

2012年(7)

2011年(33)

2010年(38)

分类: C/C++

2010-10-22 10:41:16

对于常规的方法:T [n][n]的方法我就不说了。首先介绍两个动态的创建方法,然后介绍一下C++标准的中使用STL的容器vector创建二维数组的方法。

1. 
定义:
 const int ROW = 3;
 int  size = 5;
 int  (*pi)[ROW] = new int[size][ROW];

操作方法:
 int  k = 0;
 cout <   <<"pi : " < for ( i=0; i {
  for ( int j=0; j  {
   pi[i][j] = k++;//初始化
   cout <  }
  cout < }

内存释放:
 delete[] pi;

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


2.
定义:

 int** ppi = new int*[size];
 for ( i=0; i {
  ppi[i] = new int[size];
 }

操作方法:
 cout <   <<"ppi : " < k = 0;
 for ( i=0; i {
  for ( int j=0; j  {
   ppi[i][j] = k++;//初始化
   cout <  }
  cout < }

内存释放:
 for ( i=0; i  delete[] ppi[i];
 delete[] ppi;

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


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

3.
定义:

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

操作方法:
//初始化
 vector< vector >::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 : " < for ( ; iiter!=ivec.end(); ++iiter )
 {
  for ( iter=iiter->begin(); iter!=iiter->end(); ++iter )
  {
   cout <  }
  cout < }

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

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


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

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

vector ga; 
ga.resize(m*n);

阅读(1194) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~