How to heap allocate a 2D array in C++?
本问题已经有最佳答案,请猛点这里访问。
我正在尝试这样做:
1 | std::string* Plane = new std::string[15][60]; |
然而,这段代码似乎无法编译。有没有其他方法可以达到同样的效果?感谢您的任何潜在帮助。
有三种方法可以做到这一点。
第一种方法是将其分配为"数组"结构(我将代码转换为
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!"; |
第三种方法,我认为是迄今为止最好的选择,因为它的可扩展性,是滚动一个
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的功能,如
当使用
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; |
要访问给定行/列对上的字符串,可以使用
否则,将其展平为一维数组:
1 2 3 | std::string* Plane = new std::string[15*60]; ... delete[] Plane; |
要访问给定行/列对上的字符串,可以使用
尽管如此,您应该远离使用这样的原始指针。使用
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); |
其中任何一个都允许您使用