C ++:动态增长的2d数组

时间:2012-09-07 06:19:08

标签: c++ multidimensional-array double dynamic-memory-allocation

我通过vector解决了以下问题,但我的一位同事在讨论中告诉我,使用数组会更快。

我从很多音频文件中计算了12个向量的批次(我的意思是很多!),并且必须将它们存储起来进行处理。在开始计算之前,我真的需要所有这些向量。无论如何,我无法预测有多少音频,我无法预测从每个音频中提取了多少向量。因此,我需要一种动态保持向量的结构。

因此我为每个向量创建一个新的双数组并将其推送到vector

我现在想要面对并测试,如果我的同事非常正确,可以通过使用数组而不是用于存储的向量来提高计算效果。

vector<double*>* Features = new vector<double*>();
double* feature = new double[12];
// adding elements
Features->push_back(features);

据我所知,动态创建2d数组我需要知道行数。

double* container = new double*[rows];
container[0] = new double[12];
// and so on..

我在处理完所有音频后知道行,而且我不想再处理音频两次。

任何人都知道如何解决这个问题并附加它,或者只是不可能这样做我应该使用vector或创建自己的结构(假设可能比矢量慢)。< / p>

3 个答案:

答案 0 :(得分:4)

除非有任何强烈的理由不这样做,否则我会建议这样的事情:

std::vector<std::array<double, 12>> Features;

您可以获得所需的所有内存位置,以及所需的所有自动内存管理。

答案 1 :(得分:2)

你当然可以这样做,但如果用std::vector执行此操作会更好。对于2D阵列的动态增长,您必须执行所有这些操作。

  • 创建临时2D数组
  • 为其分配内存。
  • 为每个组件数组分配内存。
  • 将数据复制到其组件数组中。
  • 删除原始2D阵列的每个组件数组。
  • 删除2D数组。
  • 接受新的输入。
  • 将新项目添加到临时2D阵列。
  • 创建原始2D阵列并为其分配内存。
  • 将内存分配给其组件数组。
  • 再次将临时数据复制到其中。

在每个步骤中执行此操作后,数组的速度更快是不可接受的。使用std:vector。以上书面答案解释了这一点。

答案 2 :(得分:0)

使用vector会使问题更容易,因为它可以自动增长数据。遗憾的是,由于向量增长的原因,使用向量可能不是最佳解决方案,因为大数据集需要增长所需的次数。另一方面,如果您将矢量的初始大小设置得相当大,但只需要少量的12个索引数组。你只是浪费了大量的内存。如果有必要产生所需大小的猜测,您可以使用该猜测值动态分配数组或最初将向量设置为该大小。

如果你只想用数据计算一次或两次,那么你应该考虑使用地图或列表。这两个大型数组结构将创建一个满足您确切需求的内存结构,并绕过增长数组的额外时间要求。另一方面,使用这些数据结构的计算将更慢。

我希望这些想法能为这次讨论增添一些替代解决方案。