在 C++ 中声明可变长度二维数组的正确方法

Posted

技术标签:

【中文标题】在 C++ 中声明可变长度二维数组的正确方法【英文标题】:Proper way to declare a variable length two dimensional array in C++ 【发布时间】:2011-11-28 09:54:50 【问题描述】:

我想获得一个二维 int 数组 arr,我可以通过 arr[i][j] 访问它。

据我了解,我可以声明 int arr[10][15]; 来获得这样的数组。 在我的情况下,大小是可变的,据我了解,如果数组的大小不是硬编码的,但我使用像 int arr[sizeX][sizeY] 这样的变量,则此语法不起作用。

最好的解决方法是什么?

【问题讨论】:

你的问题是 C,但你的标签是 C++。你能澄清一下吗?此外,您是正确的,除非sizeXsizeYconst,否则使用变量来确定数组的大小不是有效的语法。但是,gcc(或 g++)支持这一点,除非您将 -ansi-pedantic 标志传递给它们。我仍然建议不要使用它,因为它不是标准的 C/C++。 【参考方案1】:

如果您不想使用 std::vector 的向量(或新的 C++11 std::array),那么您必须手动分配所有子数组:

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

当然,完成后不要忘记delete[]

【讨论】:

@Some Programmer dude 如何删除那个?这是真的吗?删除 []arr[] ?【参考方案2】:

c/c++ 不支持多维数组。但它确实支持数组数组:

    //simulate 2-dimension array with 1-dimension array
    
        int x = 20;
        int y = 40;
        int * ar = new int(x*y);
        int idx_x =9;
        int idx_y=12;
        ar[idx_x + idx_y * x] = 23;
    
    //simulate 2-dimension array with array of array
    
        int x = 20;
        int y = 40;
        int**ar = new int*[y];
        for(int i = 0; i< y; ++i)
        
            ar[i] = new int[x];
        
        ar[9][12] = 0;      
    

【讨论】:

【参考方案3】:

如果您正在寻找 C 中的解决方案,请参阅此 Stack Overflow 线程: How do I work with dynamic multi-dimensional arrays in C?.

如果 C++ 没问题,那么您可以创建一个 2D 向量,即向量的向量。见http://www.cplusplus.com/forum/general/833/。

【讨论】:

【参考方案4】:

你不能,用数组语法。该语言要求您使用编译时常量来创建数组。

【讨论】:

您可以使用int**(或您想要的任何类型)。正确malloc()ed 后,您可以使用两个下标运算符访问元素。 @Chris Parton:这不是数组语法。它使用指针和 new 来模拟动态大小的数组。 我从来没有说过它是 :) 我只是在说明他可以像访问多维数组一样使用指针访问元素。为此,语法是相同的;但我同意使用这样的指针不是数组语法。【参考方案5】:

C++ 没有可变长度数组。您可以考虑使用vector&lt;vector&lt;int&gt; &gt;。也可以使用arr[i][j]访问。

【讨论】:

【参考方案6】:

正如 fefe 所说,您可以使用向量的向量,例如。 G。 :

#include<iostream>
#include<vector>
using namespace std;

int main()

        vector< vector<int> > vec;
        vector<int> row1;
        row1.push_back(1);
        row1.push_back(2);
        vector<int> row2;
        row2.push_back(3);
        row2.push_back(4);

        vec.push_back(row1);
        vec.push_back(row2);

        for( int ix = 0; ix < 2; ++ix)
            for( int jx = 0; jx < 2; ++jx)
                cout << "[" << ix << ", " << jx << "] = " << vec[ix][jx] << endl;


【讨论】:

以上是关于在 C++ 中声明可变长度二维数组的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 如何定义一个二维数组

如何在 C 中声明可变大小的二维数组?

将二维数组传递给 C++ 函数

c++ 用vector 定义二维数组

具有可变大小行的 C++ 二维数组

无法在 C++ 中声明动态二维数组 [重复]