数组(一维、二维、三维)的动态申请及用vector的表示方法

来源:互联网 发布:网络谣传实例 编辑:程序博客网 时间:2024/06/04 19:28

转载 :点击打开链接

变长一维数组

这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做:

#include<iostream>

using namespace std;

int main()

{

int len;

cin>>len;

//用指针p指向new动态分配的长度为len*sizeof(int)的内存空间

int *p=new int[len];

...........

delete[] p;

return 0;

}

注意int *p=new int[len];这一句,你不能这样做: int p[len]; C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行: int p[]=new int[len];编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int *p=new int[len];

以上程序实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间。
 当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组:

#include<iostream>

#include<vector>

using namespace std;

int main()

{

int len;

cin>>len;

vector<int> array(len);//声明变长数组

for(int i=0;i<len;i++)

{

array[i]=i;

cout<<array[i]<<"\t";

}

return 0;

}

2.变长二维数组

用C++实现变长二维数组时可以采用两种方法:双指针方法和使用STL中vector(向量)的方法。

首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:

int **p = new int*[num1];

而对每一个*p(一共num1个*p)申请一组内存空间:

for(int i=0; i<num1; ++i)

 p[i] = new int[num2];

其中,num1是行数,num2是数组的列数。测试的源程序如下:

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

int num1;//行数

int num2;//列数

cout<<"Please enter the number for row and column: "<<endl;

cin >> num1 >> num2;

//为二维数组开辟空间

int **p;

p= new int*[num1];

for(int i=0; i<num1; ++i)

p[i] = new int[num2];

for(int j=0;j<num1;j++)

{

for(int k=0;k<num2;k++)

{

 p[j][k]=(j+1)*(k+1);

 cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];

}

cout<<endl;

}

//释放二维数组占用的空间

for(int m=0;m<num1;m++)

delete[] p[m];

delete[] p;

return 0;

}

用vector(向量)实现二维数组,以下给出源程序:

#include <iostream>

#include <vector>

#include <iomanip>

using namespace std;

int main()

{

int i,

 j,

 m, //行数

 n; //列数

cout << "input value for m,n:";

cin>>m>>n;

//注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"。

vector<vector<int> > vecInt(m, vector<int>(n));

for (i = 0; i < m; i++)

for (j = 0; j < n; j++)

 vecInt[i][j] = i*j;

 

for (i = 0; i < m; i++)

{

for (j = 0; j < n; j++)

 cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j];

cout<<endl;

}

return 0;

}

3.变长三维数组

根据以上一、二维数组,可以推出三维数组的实现。以下是指针实现代码:

#include <iostream>

using namespace std;

void main()

{

 int ***p3;

 intx=3,y=2,z=2;

 p3=new int **[x];

 for (i=0;i<x;i++)

 {

 p3[i]=new int* [y];

 for (int j=0;j<y;j++)

 {

 p3[i][j]=new int[z];

 for (int k=0;k<z;k++)

 {

 p3[i][j][k]=i*j*k;

 }

 }

 }

 for (int k=0;k<z;k++)

 {

 for (int i=0;i<x;i++)

 {

 for (int j=0;j<y;j++)

 cout<<p3[i][j][k]<<" " ;

 cout<<endl;

 }

 cout<<endl;

 }


 for (int i=0;i<x;i++)

 {

 for (int j=0;j<y;j++)

 {

 delete [] p3[i][j];

 }

 delete [] p3[i];

 }

 delete [] p3;

}

以下是vector实现代码:

#include <iostream>

#include <vector>

using namespace std;

void main()

{

 int m=2;

 int n=3;

 int l=4;

 vector<vector<vector<int> > > v(m,vector<vector<int> >(n,vector<int>(l)));

 v[1][2][3]=4;

 cout<<v[1][2][3]<<endl;

}

4.用一维动态数组表示二维、三维动态数组

以下是程序代码:

#include <iostream>

using namespace std;

void main()

{

 int m=3,n=4,l=2;

 int *p2; //将表示二维数组

 p2=new int[m*n];

 int i,j,k;

 for (i=0;i<m;i++)

 for(j=0;j<n;j++)

 {

 p2[i*n+j]=i+j;

 }

 cout<<"二维数组"<<endl;

 for (i=0;i<m;i++)

 {

 for(j=0;j<n;j++)

 {

 cout<<p2[i*n + j]<<" ";

 }

 cout<<endl;

 }

 delete []p2;

 int *p3; //将表示三维数组

 p3=new int[m*n*l];

 for (k=0;k<l;k++)

 for (i=0;i<m;i++)

 for (j=0;j<n;j++)

 {

 p3[k*n*m + i*n + j]=i+j+k;

 }

 cout<<"三维数组"<<endl;

 for (int k=0;k<l;k++)

 {

 for (int i=0;i<m;i++)

 {

 for (int j=0;j<n;j++)

 cout<<p3[k*n*m + i*n + j]<<" " ;

 cout<<endl;

 }

 cout<<endl;

 }

 delete []p3;

}

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天猫发票被投诉怎么办 天猫机顶盒闪退怎么办 苹果8红色掉漆怎么办 毛坯房验房房及厅试水时漏水怎么办 淘宝退货赠品被拆了怎么办 如果淘宝买家说赠品不好怎么办 淘宝顾客反应没赠品怎么办 淘宝上买东西赠品不给怎么办 天猫店关了质量有问题怎么办 蘑菇街开店被骗了怎么办 百视通网络机顶盒恢复出厂后怎么办 王牌电视出现无信号怎么办 联通电视串台了怎么办 电视上出现系统更新怎么办 电视开机一直在更新怎么办 云视听极光闪退怎么办 不小心打错电话怎么办 相亲发信息不回怎么办 如果一个人微信不回电话不接怎么办 跟老公吵架打电话不接怎么办 起诉离婚对方不接电话怎么办 苹果手机接电话声音小怎么办 老公不回你微信怎么办 工地欠货款不给怎么办 朋友微信借钱不还怎么办 微信上借钱不还怎么办 微信借钱不还怎么办 微信转账借钱不还怎么办 没欠条人家欠钱不给怎么办 欠货款被告没去怎么办 别人欠我钱不接电话怎么办 借给别人钱不接电话怎么办 欠钱的人玩消失怎么办 被婚介所骗了5万怎么办 贷款紧急联系人被骚扰怎么办 微信限制加好友怎么办 珍爱网的客服老打电话怎么办 百合网的人气是怎么办 苹果x来电不显示怎么办 苹果8黑屏没反应怎么办 苹果六s开不了机怎么办