繁体   English   中英

C ++:动态增长的二维数组

[英]C++: Dynamically growing 2d array

使用vector解决以下情况,但是我的一位老同事在一次讨论中告诉我,使用数组会更快。

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

因此,我为每个向量创建一个新的double数组,并将其推入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或创建自己的结构(假定可能比vector慢)。

除非有很强的理由不这样做,否则我建议这样:

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

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

您当然可以做到这一点,但是如果使用std::vector执行此操作会更好。 为了动态增长2D阵列,您必须执行所有这些操作。

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

在每个步骤中执行完此操作之后,几乎不可能接受数组会更快。 使用std:vector 以上书面答案对此进行了解释。

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

如果只用一次或两次计算数据,那么也许应该考虑使用map或list。 大型阵列的这两个结构将创建一个满足您确切需求的内存结构,并绕开阵列增长所需的额外时间。 另一方面,使用这些数据结构的计算将较慢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM