如何在C ++中堆积2D数组?

How to heap allocate a 2D array in C++?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试这样做:

1
std::string* Plane = new std::string[15][60];

然而,这段代码似乎无法编译。有没有其他方法可以达到同样的效果?感谢您的任何潜在帮助。


有三种方法可以做到这一点。

第一种方法是将其分配为"数组"结构(我将代码转换为std::vector,因为它比处理原始指针更安全)。如果您需要每行都有自己的长度,但又占用了额外的内存,那么这是理想的选择:

1
2
3
4
5
6
7
std::vector<std::vector<std::string>> Plane(15);
for(size_t index = 0; index < 15; index++)
    Plane[index].resize(60);

for(size_t i = 0; i < 15; i++)
    for(size_t j = 0; j < 60; j++)
        Plane[i][j] ="This is a String!";

第二种是将其分配为一个扁平结构,以降低灵活性为代价显著提高性能:

1
2
3
4
5
std::vector<std::string> Plane(15 * 60);

for(size_t i = 0; i < 15; i++)
    for(size_t j = 0; j < 60; j++)
        Plane[i* 60 + j] ="This is a String!";

第三种方法,我认为是迄今为止最好的选择,因为它的可扩展性,是滚动一个Matrix类,它为您抽象出这些细节,从而减少您在编码时出错的可能性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename T>
class Matrix {
    std::vector<T> _data;
    size_t rows, columns;
public:
    Matrix(size_t rows, size_t columns) : rows(rows), columns(columns), _data(rows * columns) {}

    T & operator()(size_t row, size_t column) {
        return _data[row * columns + column];
    }

    T const& operator()(size_t row, size_t column) const {
        return _data[row * columns + column];
    }
};

Matrix<std::string> Plane(15, 60);
for(size_t i = 0; i < 15; i++)
    for(size_t j = 0; j < 60; j++)
        Plane(i, j) ="This is a String!";

当然,这是一个非常简单的实现;您可能希望添加一系列类似STL的功能,如rows()columns()at()begin()end()等。


当使用new[]分配多维数组时,必须分别分配每个维度,例如:

1
2
3
4
5
6
7
8
9
std::string** Plane = new std::string*[15];
for(int i = 0; i < 15; ++i)
    Plane[i] = new std::string[60];

...

for(int i = 0; i < 15; ++i)
    delete[] Plane[i];
delete[] Plane;

要访问给定行/列对上的字符串,可以使用Planes[row][column]语法。

否则,将其展平为一维数组:

1
2
3
std::string* Plane = new std::string[15*60];
...
delete[] Plane;

要访问给定行/列对上的字符串,可以使用Planes[(row*60)+column]语法。

尽管如此,您应该远离使用这样的原始指针。使用std::vectorstd::array代替:

2

1
2
// C++11 and later only...
std::vector<std::array<std::string, 60>> Planes(15);
1
2
3
// C++11 and later only...
using Plane_60 = std::array<std::string, 60>;
std::unique_ptr<Plane_60[]> Planes(new Plane_60[15]);
1
2
3
// C++14 and later only..
using Plane_60 = std::array<std::string, 60>;
std::unique_ptr<Plane_60[]> Planes = std::make_unique<Plane_60[]>(15);

其中任何一个都允许您使用Planes[row][column]语法访问字符串,同时为您管理数组内存。