0

我用 a 解决了以下情况vector,但是我的一位年长的同事在讨论中告诉我,使用数组会快得多。

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

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

我现在想面对和测试,如果我的同事真的是正确的,那么计算可以通过使用数组而不是向量来进行存储来提高。

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

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

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

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

任何人都知道如何解决这个问题并附加它,或者以这种方式不可能,我应该使用任何一个vector或创建自己的结构(假设可能比向量慢)。

4

3 回答 3

4

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

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

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

于 2012-09-07T06:30:47.757 回答
2

你当然可以这样做,但如果你用std::vector. 对于二维数组的动态增长,您必须执行所有这些操作。

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

在每一步都这样做之后,很难接受数组会更快。使用std:vector. 上面的书面答案解释了这一点。

于 2012-09-07T06:34:20.253 回答
0

使用向量将使问题变得更容易,因为它使数据自动增长。不幸的是,由于向量的增长方式,使用向量可能不是最佳解决方案,因为大型数据集需要增长的次数。另一方面,如果您将向量的初始大小设置得非常大,但只需要少量的 12 个索引数组。你只是浪费了大量的内存。如果有某种方式可以猜测所需的大小,您可以使用该猜测值来动态分配数组或最初将向量设置为该大小。

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

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

于 2013-04-25T19:56:28.903 回答