矢量矢量有哪些问题?

时间:2016-07-07 11:35:39

标签: c++ matrix vector 2d dimensions

我已经读过,vector - of - vector s在给定固定的2 nd 维度时是不好的,但我无法找到有关问题的明确解释http://www.stackoverflow.com

有人可以解释为什么在单个vector上使用二维索引优于使用vector - of - vector s用于固定的2 nd 维度?

另外,我假设vector - of - vector s是具有变量2 nd 维度的2D数组的首选数据结构?如果有任何相反的证据,我很乐意看到。

3 个答案:

答案 0 :(得分:8)

对于std::vector,底层数组是从堆中动态分配的。如果您有例如std::vector<std::vector<double>>,那么你的外部矢量看起来像

{v1, v2, v3, v4, ... vn}

这个看起来就像每个内部向量都在连续的内存中,它们会,但它们的底层数组将不是连续的。请参阅this post中的内存布局图。换句话说,你不能说那个

&(v1.back()) + 1 == &(v2.front()) // not necessarily true!

相反,如果您使用带有striding的单个向量,那么您将获得数据位置,并且它本身会更加cache friendly,因为您的所有数据都是连续的。

为了完整起见,如果矩阵稀疏,我会使用这两种方法的,因为more elegant and efficient storage schemes比直的1D或2D数组。虽然你提到你有一个&#34;固定的第二维&#34;我会假设这不是这种情况。

答案 1 :(得分:5)

我将以一个简单的类比回答。

这两件事中的“更好”是什么?

  1. 一个电话簿,其中每个条目都是一个代码,指的是您必须查找和阅读的另一本书以发现某人的电话号码
  2. 列出人员电话号码的电话簿
  3. 将所有数据保存在一个大blob中,在计算机缓存中更简单,更明智,更容易。其中包含 N 向量的向量在操作上更复杂(请记住,每个向量都需要动态分配和大小管理操作!);一个向量就是一个向量。您没有将工作负荷乘以 N

    唯一的缺点是,要使用1D底层数据存储来模拟2D阵列访问,您需要编写外观。幸运的是,这很容易。

    现在主观部分:总的来说,除非你真的真的并且你的代码质量并不特别重要,否则我认为这是值得的。

答案 2 :(得分:3)

使用矢量矢量:

  1. 由于分配了多个块,在内存分配方面效率低下。
  2. 模拟锯齿状的右手边缘,因此虫子可以进入。
  3. 通常,使用单个向量会更好,因为内存管理更简单。但是如果你的矩阵很大,你可能会遇到问题,因为很难获得一个大的连续块。

    如果您的阵列可以调整大小,那么我仍然坚持使用单个向量:可以在一个可以优化的函数中隔离调整大小的复杂性。

    当然,最好的解决方案是使用Boost中提供的线性代数库(BLAS)之类的东西。这也可以很好地处理大型稀疏矩阵。