问题:
如何快速给数组分配自定义长度的内存,方法有哪些?
本博客提供六种方法介绍,包含各种常用用法,且代码片亲自 编写-注解-编译-通过,对读者负责。
阐述:
提到动态分配C++的数组,我们想到的标签会有:malloc-free、new-delete、一维、二维...等等,本博客初创初心是各大公司企业都 会青睐于在笔试或者面试中,要求应届生具备手写分配内存、或者排序之类的代码的能力,所以提供六种用法。
正文:
1、利用“malloc-free”动态分配一维数组:
#include <iostream>
#include<stdlib.h> //该头文件为malloc必须
using namespace std;
int main()
{
int len;
int *p;
cout<<"请输入开辟动态数组的长度:"<<endl;
cin>>len;
//长度乘以int的正常大小,才是动态开辟的大小
p = (int*)malloc(len*sizeof(int));
cout<<"请逐个输入动态数组成员:"<<endl;
for(int i=0; i<len; ++i)
{
//此处不可以写成:cin>>*p[i]
cin>>p[i];
}
cout<<"您输入的动态数组为:"<<endl;
for(int i=0; i<len; ++i)
{
cout<<p[i]<<" ";
}
//时刻记住:有malloc就要有free
free(p);
}
2、利用“malloc-free”动态分配二维数组:
扫描二维码关注公众号,回复:
2568921 查看本文章
#include <iostream>
#include<stdlib.h> //该头文件为malloc必须
using namespace std;
int main()
{
int row,col;
int **p;
cout<<"请输入开辟动态数组的行 & 列:"<<endl;
cin>>row>>col;
//开始开辟
p = (int**)malloc(row*sizeof(int*));//为数组的行开辟空间
for(int i=0; i<row; ++i)
{
*(p+i)=(int*)malloc(col*sizeof(int));//为数组的列开辟空间
}
//输入成员
cout<<"请逐个输入动态数组 各行各列 成员:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
//此处不可以写成:cin>>*p[i] [j]
cin>>p[i][j];
}
//输出成员
cout<<"您输入的动态数组 各行各列 成员如下:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
cout<<p[i][j];
}
//时刻记住:有malloc就要有free
for(int i=0; i<row; ++i)
{
free(*(p+i));
}
}
3、利用“new-delete”动态分配一维数组:
#include <iostream>
using namespace std;
int main()
{
int len;
cout<<"请输入开辟数组的长度:"<<endl;
cin>>len;
int *p = new int [len];
//数据输入
cout<<"请逐个输入数据:"<<endl;
for(int i=0; i<len; ++i)
{
cin>>p[i];
}
//数据反馈
cout<<"您分配的动态数组为:"<<endl;
for(int i=0; i<len; ++i)
{
cout<<p[i]<<" ";
}
//释放内存:
delete []p;
}
4、利用“new-delete”动态分配二维数组:
#include <iostream>
using namespace std;
int main()
{
int row,col;
cout<<"请输入开辟数组的行 & 列:"<<endl;
cin>>row>>col;
//行的开辟
int **p = new int*[row];
for(int i=0; i<row; ++i)
{
//列的开辟
p[i] = new int[col];
}
//数据输入
cout<<"请逐个输入 各行各列 数据:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
cin>>p[i][j];
}
//数据反馈
cout<<"您分配的动态数组为:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
cout<<p[i][j]<<"";
}
//释放内存:
delete []p;
}
5、利用“new-delete”动态分配二维数组:
#include <iostream>
#include<vector>
using namespace std;
int main()
{
int row,col;
cout<<"请输入行 & 列:"<<endl;
cin>>row>>col;
//很复杂的结构:对于某些编译器,注意连空格都不可以忽略
vector<vector<int> > p(row,vector<int>(col));
//数据输入
cout<<"请逐一输入 各行各列 数据:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; j++)
{
cin>>p[i][j];
}
//数据输出
cout<<"您输入的数据:"<<endl;
for(int i=0; i<row; ++i)
for(int j=0; j<col; j++)
{
cout<<p[i][j]<<" ";
}
//该方法利用的是两重的vector而无需释放
}
6、利用while的极其简单输入实现求和、求平均之类算法:
#include <iostream>
using namespace std;
int main()
{
int sum=0,value=0;
//实际上非数字就会结束循环
cout<<"请输入求和数字,以*号作为结束;"
while(cin>>value)
sum += value;
cout<<"您输入数据之和为:"<<sum<<endl;
}
总结:
以上方法有简单的,也有非常复杂而且古老的,用哪个、按照那种思路去做?主要看代码的用处和时间的复杂度要求;
转自:
https://blog.csdn.net/errors_in_life/article/details/78889951