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

时间:2017-09-26 20:02:46

标签: c++ arrays heap

我正在尝试做这样的事情:

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

但是这段代码似乎没有编译。 有没有其他方法可以实现相同的结果? 感谢任何潜在的帮助。

2 个答案:

答案 0 :(得分:1)

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

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]语法。

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

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

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

话虽如此,你应该远离使用像这样的原始指针。请改用std::vectorstd::array

typedef std::vector<std::string> string_vec;
// or, in C++11 and later:
// using string_vec = std::vector<std::string>;
std::vector<string_vec> Planes(15, string_vec(60));

// C++11 and later only...
std::vector<std::array<std::string, 60>> Planes(15);

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

// 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]语法访问字符串,同时为您管理数组内存。

答案 1 :(得分:1)

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

首先是将其分配为数组&#39;结构(我将您的代码转换为std::vector,因为它比处理原始指针更安全)。如果您需要每一行都有自己的长度,但这会占用额外的内存,这是理想的选择:

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!";

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

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类,它为你提取这些细节,使你不太可能犯错误。你的编码:

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()等。< / p>