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

Posted

技术标签:

【中文标题】这是查找动态分配数组长度的好方法吗?【英文标题】:Is this a good way to find the length of a dynamically allocated array? 【发布时间】:2011-11-30 02:06:05 【问题描述】:

我有一个 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;

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

【问题讨论】:

你确定你的方法有效吗? while 条件在遇到错误条件(当元素为 0 时)之前不会停止,并且您将因访问冲突而排队。 原来这是完全错误的,谢谢指出。只是我对STL不熟悉。 【参考方案1】:

您依赖于未定义的行为;无法保证当您超出数组的边界时会发生什么。这通常不起作用。

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

【讨论】:

【参考方案2】:

你的假设是完全错误的;您无法以任何接近您建议的方式获得尺寸。这是完全未定义和危险的行为。

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

不要使用指针。不要使用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

【讨论】:

我只是想避免使用容器,但我想要么是这种方式,要么是将数组的大小传递给构造函数。另一方面,您是否介意向我指出有关您提到的规则的更多信息。我的意思是我不明白为什么它不是真的,但也不明白我为什么要遵循它。 @Erick 这更像是初学者指南,而不是规则本身。它的真正含义是,“除非您完全熟悉内存管理、指针数学以及传递数组的含义,否则最好只使用经过安全边界检查和自动管理的 STL 容器。” @ErickMartinez:为什么你想避免使用容器?它们正是为这种事情而生的。该规则鼓励您习惯性地使用 C++(让您有更大的机会编写正确代码),从长远来看,这对每个人都有好处。 @Crashworks:是和不是。首先,标准容器不进行边界检查。其次,这条规则适用于所有人,但对于专家来说,它意味着“只在小的、明确定义的、本地化的职责范围内使用指针,并在一般情况下使用巧妙的构建块组合”。 @ErickMartinez:不要害羞,花点时间看看标准库——你会发现容器让你的代码更加直接!如果您将标准库算法与容器结合使用,您通常可以用很少的几行甚至更多的self-descriptive 行来表达复杂的过程。这是一种真正的快乐 :-) 祝你好运,玩得开心!【参考方案3】:

如果这行得通,那纯属运气。您不知道为矩阵分配的内存之外还有什么,尤其是当它为 null 时。

坚持如下:

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

【讨论】:

【参考方案4】:

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

请领取一份Effective STL。

另外,如果您想更清楚为什么需要多维数组,我们或许可以提出更好的解决方案。

【讨论】:

以上是关于这是查找动态分配数组长度的好方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

用new运算符动态分配一个长度为n的整型数组

c中可以定义变长数组吗

OpenCL中不允许使用可变长度数组声明 - 为什么?

数组以及排序和查找

动态数组

如何得到指针指向的数组的长度