我已经用指针在c++中声明了2d数组.如何将值初始化为数组



我已经使用指针在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::vectorinitializer_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},
};

相关内容

  • 没有找到相关文章

最新更新