这是查找动态分配数组长度的好方法吗?

时间:2011-11-30 02:06:06

标签: c++ arrays pointers dynamic

我有一个Matrix类,我想将一个数组传递给构造函数,以便动态设置矩阵的值。我发现如果我分配这样的数组:

double **array;
array = new double*[3];
array[0] = new double[2];
array[1] = new double[2];
array[2] = new double[2];
array[0][0] = 1;
array[0][1] = 1;
array[1][0] = 1;
array[1][1] = 1;
array[2][0] = 1;
array[2][1] = 1;

我可以使用如下方法获取行数和列数:

int getNRows(double **data){
  int size = 0;
  while(*(data+size)){size++;}
  return size;
}

int getNCols(double **data){
  int size = 0;
  while(**(data+size)){size++;}
  return size;
}

这样可以,还是应该坚持使用矢量声明?

4 个答案:

答案 0 :(得分:5)

你依赖于未定义的行为;当你超出数组的范围时,无法保证会发生什么。这一般不起作用。

使用std::vector或其他容器类。

答案 1 :(得分:4)

你的假设是完全错误的;你不能以任何接近你建议的方式获得尺寸。这完全是不明确和危险的行为。


这是一个伪规则(即它不是真的,但除非你理解为什么它不是真的,它适用于你):

不要使用指针。请勿使用newdelete。 (并且不要说using namespace std;。)


您应该这样做的唯一方法是使用C ++容器。

向量矢量将是第一个镜头,尽管在步幅中访问的平面向量可能更好,而Boost.multi_array甚至可能是最好的:

  • std::vector< std::vector<double> > v (3, std::vector<double>(2));

  • std::array<std::array<double, 2>, 3>

  • std::vector<double> v(6);,并使用v[i + 2 *j]

  • Boost.MultiArray

答案 2 :(得分:2)

如果这是有效的,那就是纯粹的运气。你不知道为矩阵分配的内存超出了什么,特别是如果它是null。

坚持:

std::vector<std::vector<double>> matrix;

答案 3 :(得分:2)

在数组中存储值0时会发生什么?您需要存储大小并将其传递给在数据结构上运行的函数,或者使用像std::vector这样的STL容器。

请选取Effective STL的副本。

此外,如果您想更清楚地了解为什么需要多维数组,我们可能会提出更好的解决方案。