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

4
我希望能获得一个二维 int 数组 arr,并通过 arr[i][j] 进行访问。
据我了解,我可以声明 int arr[10][15]; 来获取这样的数组。但在我的情况下,大小是可变的。据我所知,如果数组的大小不是硬编码的,而是使用像 int arr[sizeX][sizeY] 这样的变量,则此语法无效。
有什么好的解决方法吗?

2
你的问题标签是C++,但是你的标签是C。你能否澄清一下?此外,你是正确的,除非sizeXsizeYconst,否则使用变量来确定数组大小不是有效的语法。然而,gcc(或g++)支持这种用法,除非你传递给它们-ansi-pedantic标志。我仍然建议不要使用它,因为它不是标准的C/C++写法。 - Chris Parton
6个回答

11
如果您不想使用std::vector或新的C++11std::array,那么您必须手动分配所有子数组:
int **arr = new int* [sizeX];
for (int i = 0; i < sizeX; i++)
    arr[i] = new int[sizeY];

当然,在完成时不要忘记delete[]所有内容。

@某位程序员大佬,怎么删除它?这种方式正确吗?delete []arr[]? - eylay

1

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;      
    }

0

0

你无法使用数组语法来实现。这种编程语言要求你使用编译时常量来创建数组。


你可以使用 int **(或任何你想要的类型)。一旦你正确地使用了 malloc(),你就可以使用两个下标运算符来访问元素。 - Chris Parton
@Chris Parton:这不是数组语法。它使用指针和new来模拟动态大小的数组。 - Daniel Daranas
1
我从未说过它是 :) 我只是想指出他可以使用指针以与多维数组相同的方式访问元素。为此,语法是相同的;但我同意像那样使用指针并不是数组语法。 - Chris Parton

0

C++没有可变长度数组。您可以考虑使用vector<vector<int> >。也可以使用arr[i][j]进行访问。


0

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

#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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接