您的位置:首页 > 编程语言 > C语言/C++

C++中关于一维、二维、三维动态数组的定义

2016-03-19 21:28 706 查看
定长数组我们在这里就不讨论了,想要知道如何定义定长数组的童鞋麻烦出门直走前面左转~

一、什么是动态数组

也就是在编译时无法确定数组长度,程序在运行时需要动态分配内存空间的数组,比如需要根据输入(cin>>n)中的n来确定的数组长度。此时,你不能这样:

int arr
;  // error: C2057: 应输入常量表达式

否则C++编译器必然会报错说len的大小不能确定,因为这种申明数组的方式默认了数组的大小需要在编译时确定;同时你也不能这样:

int arr[] = new int
; //error: C2440: “初始化”: 无法从“int *”转换为“int []”

编译器会说不能将int*型转为int[]型,因为用new开辟的内存空间都会返回这段内存的首地址,所以应该这样写:

int *arr = new int
;

二、定义数组

1、定义一维数组

法1:

int *p = new int
;



法2:

vector<int> arr(n,0);//若使用法二需要引入头文件 #include <vector>


2、定义二维数组

法一(双指针法,此方法比较麻烦):

先定义一个指向指针的指针p:

int **p = new int*
;


然后对每个*p申请一组内存空间:

for(int i=0;i<n;i++) p[i] = new int[m];



法二:

<vector <vector<int>> arr(n,vector<int>(m,0));//初始化为0

3、三维数组以此类推
由于时间关系在此只给出vector方式的定义:vector<vector<vector<int>>> arr(m,vector<vector<int>>(n,vector<int>(l)));//暂未初始化



#下面附上2016年网易的一个采蘑菇的真题0.0#想歪的憋说话,用心感受- -

题目内容:

[编程题]扫描透镜

在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只
有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇? (注:若方格中有多个蘑菇,扫描透镜以此只能扫出一个)


输入描述:


第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小;
接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇.
一个方格可以种无穷个蘑菇.



输出描述:

输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.

鄙人的解答(水平有限,喷子绕行~):
#include <iostream>
#include <vector>
#include <algorithm>
//#include <math.h>

using namespace std;
int main()
{
int N,M,K;
while(cin>>N>>M>>K){
if(N<3)N = 3;
if(M<3)M = 3;
vector<vector<int>> arr1(N,vector<int>(M,0));
vector<vector<int>> arr2;
int max_num = 0;
int x,y;
int max1 = 0,max2 = 0;
while(K-- > 0){
cin>>x>>y;
arr1[x-1][y-1]++;
}
//        cout<<arr1[0][0]<<arr1[0][1]<<arr1[1][1]<<arr1[1][0]<<endl;
for(int i=0;i<N-2;i++){
for(int j=0;j<M-2;j++){
max1 = 0;
arr2 = arr1;
for(int k=i;k<i+3;k++){
for(int l=j;l<j+3;l++){
if(arr2[k][l]>0){
arr2[k][l]--;
max1++;
}
}
}
for(int m=0;m<N-2;m++){
for(int n=0;n<M-2;n++){

4000
max2 = 0;
for(int k=m;k<m+3;k++){
for(int l=n;l<n+3;l++){
if(arr2[k][l]>0){
max2++;
}
}
}
max_num = max(max_num,max1+max2);
}
}
}
}
cout<<max_num<<endl;
}
return 0;
}//答案正确:恭喜!您提交的程序通过了所有的测试用例
#今天的心情也是大起大落,徘徊在“宝宝心里苦,但并没卵用”及“卧槽,宝宝似乎很开心”中,感觉要精神分裂了有木有~~人还是复杂,单单是这点,阿法狗要追上人类,目测还得要个几十年啊哈哈哈哈。似乎跑题了- -!总结就到这里,不知道你有没有get到新的知识呢#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息