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

定长数组我们在这里就不讨论了,想要知道如何定义定长数组的童鞋麻烦出门直走前面左转~

一、什么是动态数组

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

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

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

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

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

int *arr = new int[n];


二、定义数组

1、定义一维数组

法1:

int *p = new int[n];

法2:

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

2、定义二维数组

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

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

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

然后对每个*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++){
                        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到新的知识呢#


    原文作者:The__Flash
    原文地址: https://blog.csdn.net/alex2917/article/details/50933233
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞