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:
法2:
2、定义二维数组
法一(双指针法,此方法比较麻烦):
先定义一个指向指针的指针p:
然后对每个*p申请一组内存空间:
法二:
#下面附上2016年网易的一个采蘑菇的真题0.0#想歪的憋说话,用心感受- -
题目内容:
[编程题]扫描透镜
在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只
有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇? (注:若方格中有多个蘑菇,扫描透镜以此只能扫出一个)
输入描述:
输出描述:
鄙人的解答(水平有限,喷子绕行~):
一、什么是动态数组
也就是在编译时无法确定数组长度,程序在运行时需要动态分配内存空间的数组,比如需要根据输入(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到新的知识呢#
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- RJ-45接口信号定义
- 定义标题的最好方法
- C#动态创建button的方法
- Ruby定义私有方法(private)的两种办法
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- C#动态调整数组大小的方法
- Lua和C语言的交互详解
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- linux----->shell高级编程----1