我通过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>
答案 0 :(得分:4)
除非有任何强烈的理由不这样做,否则我会建议这样的事情:
std::vector<std::array<double, 12>> Features;
您可以获得所需的所有内存位置,以及所需的所有自动内存管理。
答案 1 :(得分:2)
你当然可以这样做,但如果用std::vector
执行此操作会更好。对于2D阵列的动态增长,您必须执行所有这些操作。
在每个步骤中执行此操作后,数组的速度更快是不可接受的。使用std:vector
。以上书面答案解释了这一点。
答案 2 :(得分:0)
使用vector会使问题更容易,因为它可以自动增长数据。遗憾的是,由于向量增长的原因,使用向量可能不是最佳解决方案,因为大数据集需要增长所需的次数。另一方面,如果您将矢量的初始大小设置得相当大,但只需要少量的12个索引数组。你只是浪费了大量的内存。如果有必要产生所需大小的猜测,您可以使用该猜测值动态分配数组或最初将向量设置为该大小。
如果你只想用数据计算一次或两次,那么你应该考虑使用地图或列表。这两个大型数组结构将创建一个满足您确切需求的内存结构,并绕过增长数组的额外时间要求。另一方面,使用这些数据结构的计算将更慢。
我希望这些想法能为这次讨论增添一些替代解决方案。