【问题标题】:Dynamically allocate 2D array without using any loops?动态分配二维数组而不使用任何循环?
【发布时间】:2012-09-28 06:57:32
【问题描述】:

我们能否在不使用任何 for 循环或 while 循环的情况下动态分配二维数组? 我在c c++中有任何直接命令或函数吗?

【问题讨论】:

  • 嗯....是吗?我的意思是,您永远不需要使用循环来动态分配二维数组。
  • this answer,里面的代码。

标签: c++ c dynamic allocation multidimensional-array


【解决方案1】:

如果不使用循环,您将在 ISO c++ 中有一个限制,即必须在编译时确定一维的大小。那么这个分配可以在一条语句中完成,如下所示:

#define COLUMN_SIZE 10 // this has to be determined at compile time
int main()
{
    int (* arr)[COLUMN_SIZE];
    int rows = 20; // this is dynamic and can be input from user at run time
    arr = new int[rows][COLUMN_SIZE];
    arr[3][4] = 10;
    cout << arr[3][4] << endl;
    return 0;
}

new分配的内存需要被释放。此外,如果我们将其扩展到 n 维,只有一个可以在运行时确定。 原因是编译器必须知道每一行的大小才能创建一行连续的内存

【讨论】:

    【解决方案2】:

    虽然您应该避免使用原始指针,但这应该可行->

    int *myArray = new int[R*C];
    

    这里 R 是行数,C 是列数。虽然它实际上是一维数组,但您可以将其作为二维数组进行操作。比如myArray[i][j]可以读作->

    myArray[i*C + j]
    

    【讨论】:

    • 是的,但有效的语法仍然是一维数组,无法使用 [][] 或 *(*(arr+row)+col) 访问它
    • 事实上,当您谈论与数组数组形成对比的二维数组时,这几乎总是您想要的(这可能是 OP 与二维数组混淆的原因)。
    • 如果你想避免原始指针,那么vector&lt;int&gt; a(R*C)显然有同样的效果。
    【解决方案3】:

    使用 out 循环的唯一方法是分配一个伪二维数组:

    int *ary = new int[sizeX * sizeY];
    

    但随后访问它是非标准的,坦率地说是丑陋的:

    ary[y*sizeX + x]
    

    如果你想要一个“真实的”二维数组,那么你就卡在循环初始化中:

    int **ary = new int*[sizeY];
    for(int i = 0; i < sizeY; ++i) {
        ary[i] = new int[sizeX];
    }
    

    但是你必须小心清理:

    for(int i = 0; i < sizeY; ++i) {
        delete [] ary[i];
    }
    delete [] ary;
    

    在我看来

    std::vector<std::vector < int> >  
    

    可能是实际应用中最简单、最安全的方式。

    【讨论】:

    • 伪二维数组不是唯一的方法。如果在编译时确定一维值,您仍然可以在没有循环的情况下进行分配。
    【解决方案4】:

    以 arr[..][..] 格式访问的替代方法。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int COL ;
        int ROW ;
        COL = 8;
        ROW = 12;
        int (*p)[COL];
        int *mem = (int*)malloc(sizeof(int)*COL*ROW);
        memset(mem,0,sizeof(int)*COL*ROW);
        p = (int (*)[10])mem;
    
        printf("0x%p\n", p);
        printf("0x%p %d\n", p+1, (((int)(p+1))-((int)p))/sizeof(int));
    
        mem[2*COL+0] = 1;
        printf("%d\n", p[2][0]);
        mem[2*COL+5] = 2;
        printf("%d\n", p[2][5]);
        mem[6*COL+7] = 3;
        printf("%d\n", p[6][7]);
    
        p[1][2] = 4;
        printf("%d\n", mem[1*COL+2]);
    
        free(p);
    
        return 0;
    }
    

    当然,你可以直接int (*p)[COL] = (int (*)[COL]) malloc(sizeof(int)*COL*ROW);

    【讨论】:

      【解决方案5】:

      std::map&lt;TypeDim1, std::map&lt;TypeDim2, TypeContent&gt; &gt; 可能是动态分配的选择来表示二维数组。

      #include <map>
      typedef std::map<int, std::map<int, std::string> > array2dstring;
      
      int main(int argc, char *argv[])
      {
         array2dstring l_myarray2d;
         l_myarray2d[10][20] = "Anything"; 
      }
      

      【讨论】:

      • 一个选择?是的。考虑到任何可能的方式来考虑数组的定义,这是一个合理的选择吗? 绝对不是!
      • 这只对稀疏矩阵有用。
      【解决方案6】:

      尝试用递归替换循环

      【讨论】:

      • memset 不分配内存。它只用一些值填充内存块
      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2013-11-24
      相关资源
      最近更新 更多