我正在尝试做这样的事情:
std::string* Plane = new std::string[15][60];
但是这段代码似乎没有编译。 有没有其他方法可以实现相同的结果? 感谢任何潜在的帮助。
答案 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::vector
或std::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>