我已经使用指针在C++中声明了一个2D数组。
int **matrix = new int*[5];
for(int i=0;i<5;i++)
{
matrix[i] = new int[5];
}
现在,由于我已经将内存分配给数组"matrix",我想知道如何初始化此格式的所有数组项:
int arr[2][5] =
{
{1,8,12,20,25},
{5,9,13,24,26}
};
您应该使用std::vector而不是new[]。如果您的编译器支持它(较新的编译器支持),则可以使用初始值设定项列表。
std::vector<std::vector<int>> matrix = { { 1, 2, 3 }, { 4, 5 } };
您建议的方法仅适用于固定大小的数组,而不适用于动态数组。您需要自己初始化它们(从文件中读取,使用循环等)。或者,如果您确定数组的维度,请使用2D数组,而不是动态分配
或者您可以使用C++11。
在C++11中,您可以使用运算符new[]进行统一初始化。例如:
auto arr = new int[2][5] {
{1,8,12,20,25},
{5,9,13,24,26}
};
正在Clang 3.4 上工作
最简单的方法是使用嵌套的std::vector
和initializer_list
。
动态分配的多维数组非常容易出错。例如,如果你仔细观察你的例子,你会发现[2][5]矩阵的正确代码是:
int **matrix = new int*[2];
for(int i(0); i < 2; ++i)
matrix[i] = new int[5];
如果你真的想要一个矩阵,可能std::vector<std::vector<int>>
和int** matrix
都不是好的布局(主要问题是你失去了数据的局部性)。
一个非常好用的经典解决方案是围绕单个向量的包装器,它可以跟踪所表示的矩阵的"形状",并提供一个访问数据的操作符:
class matrix
{
public:
matrix(unsigned rows, unsigned columns)
: columns_(columns), data_(columns * rows)
{}
matrix(std::initializer_list<std::initializer_list<int>> lst)
: matrix(lst.size(), lst.size() ? lst.begin()->size() : 0)
{
unsigned i(0), j(0);
for (const auto &l : lst)
{
for (const auto &v : l)
{
operator()(i, j) = v;
++j;
}
j = 0;
++i;
}
}
int &operator()(unsigned row, unsigned column)
{ return data_[row * columns_ + column]; }
private:
unsigned columns_;
std::vector<int> data_;
};
你可以写:
matrix m = {
{1,8,12,20,25},
{5,9,13,24,26},
};