向量向量的问题是什么?

What are the Issues with a vector-of-vectors?

我读到 vector-of-vectors 在给定固定的 2nd 维度时是不好的,但我找不到明确的http://www.whosebug.com.

问题的解释

有人能解释一下为什么在单个 vector 上使用 2D 索引比在固定的 2[=24= 上使用 vector-of-vector 更可取吗]nd维度?

此外,我假设 vector-of-vectors 是具有变量 2nd[=27= 的二维数组的首选数据结构] 尺寸?如果有相反的证据,我很乐意看到。

使用向量的向量:

  1. 由于分配了多个块,因此在内存分配方面效率低下。
  2. 为锯齿状的右手边缘建模,因此错误可能会潜入。

一般来说,使用单个向量更好,因为内存管理更简单。但是如果你的矩阵很大,你可能会遇到问题,因为很难获得一个大的连续块。

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

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

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

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

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

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

相反,如果您使用带有 striding then you would gain data locality, and it would inherently be more cache friendly 的单个向量,因为您的所有数据都是连续的。

为了完整起见,如果您的矩阵是稀疏的,我将 都不使用 这些方法,因为有 more elegant and efficient storage schemes 比直接一维或二维数组。虽然既然你提到你有一个 "fixed 2nd dimension" 我会假设这里不是这种情况。

我会用一个简单的类比来回答。

这两件事中 "better" 的一般情况是什么?

  1. 一本电话簿,其中每个条目都是一个代码,指向不同的书,您必须找到并阅读它才能发现某人的电话号码
  2. 列出人们电话号码的电话簿

将所有数据保存在一个大 blob 中更简单、更明智,也更容易处理计算机的缓存。其中包含 N 个向量的向量在操作上要复杂得多(请记住,每个向量都需要动态分配和大小管理操作!);一个向量就是一个向量。您还没有将工作量乘以 N

真正唯一的缺点是,要使用一维底层数据存储模拟二维数组访问,您需要编写外观。幸运的是,这很容易。

现在对于主观部分:总的来说,我会说这是值得的,除非你真的很匆忙并且你的代码质量并不特别重要。