您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第34讲-动态数组
发布时间:2021-05-20 17:35:17编辑:雪饮阅读()
C++动态数组
1.变长一维数组
这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做:
#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];
vector(向量)實現變長數組
上面的實例實現了變長一維數組,要养成一个好习惯,就是注意要注销指针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;
}
編譯並運行結果如:
23
0/t1/t2/t3/t4/t5/t6/t7/t8/t9/t10/t11/t12/t13/t14/t15/t16/t17/t18/t19/t20/t21/t22/t
Process returned 0 (0x0) execution time : 3.223 s
Press any key to continue.
變長二維數組(雙指針法)
在C++中可以通过new和delete运算符动态开辟和释放空间,其中new与C中malloc函数的功能相似,delete与C中free函数的功能相似。用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=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);
/*
setw(int n)是c++中在输出操作中使用的字段宽度设置,设置输出的域宽,n表示字段宽度。
只对紧接着的输出有效,紧接着的输出结束后又变回默认的域宽。当后面紧跟着的输出字段长度小于n的时候,在该字段前面用空格补齐;
当输出字段长度大于n时,全部整体输出。
*/
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;
}
編譯並運行結果如:
Please enter the number for row and column:
2 3
1:0x966190 2:0x966194 3:0x966198
2:0x9661e0 4:0x9661e4 6:0x9661e8
Process returned 0 (0x0) execution time : 2.347 s
Press any key to continue.
大家可以看到,由于数组空间是动态分配的,数组行之间的地址空间是不连续的,因为不同行的数组元素的地址空间是用不同的new来分配的。而每一行之中列之间的地址空间是连续的。
用vector(向量)实现可變二维数组
上面實現了雙指針法可變二維數組,接下來用vector方式來實現可變二維數組。
一個具體的實例如:
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
int i;
int j;
//行数
int m;
//列数
int 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;
}
編譯並運行結果如:
input value for m,n:2 3
0: 0x736200 0: 0x736204 0: 0x736208
0: 0x736250 1: 0x736254 2: 0x736258
Process returned 0 (0x0) execution time : 2.144 s
Press any key to continue.
大家可以看到,这里vector中元素的内存的地址分配也有同双指针实现的二维数组有同样的特点。不过用vector的方法比使用双指针简单地多,分配内存空间时会更安全,数组初始化代码也更简单,所以本人建议使用STL中的vector来实现变长多维数组。
另外這裏可以發現vector其實和java中的汎型是不是特別相像哈哈。
用vector来实现变长多维数组
既然vector實現變長多維數組比較簡單,那麽這裏來挑戰下三維變長數組。
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
int i,j,k;
//一维坐标
int m;
//二维坐标
int n;
//三维坐标
int l;
cout <<"input value for m,n,l:";
cin>>m>>n>>l;
/*
申請可變三維數組的内存,並填充
*/
vector<vector<vector<int> > >vecInt(m,vector<vector<int> >(n,vector<int>(l)));
for(i=0;i<m;i++){
for (j = 0; j < n; j++){
for(k = 0; k < l; k++){
vecInt[i][j][k] = i+j+k;
}
}
}
//可變三維數組輸出
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<l;k++){
cout<<setw(5)<<vecInt[i][j][k]<<":"<<setw(9)<<&vecInt[i][j][k];
}
/*
endl是一个函数模板,它实例化之后变成一个模板函数,其作用:
插入换行符并刷新输出流。其中刷新输出流指的是将缓冲区的数据全部传递到输出设备并将输出缓冲区清空。
*/
cout<<endl;
}
cout<<endl;
}
return 0;
}
那麽編譯運行結果如:
关键字词:動態數組,vector
上一篇:第33讲-动态内存管理
下一篇:第35讲-从函数或方法返回内存
相关文章
-
无相关信息