我已经读过,vector
- of - vector
s在给定固定的2 nd 维度时是不好的,但我无法找到有关问题的明确解释http://www.stackoverflow.com
有人可以解释为什么在单个vector
上使用二维索引优于使用vector
- of - vector
s用于固定的2 nd 维度?
另外,我假设vector
- of - vector
s是具有变量2 nd 维度的2D数组的首选数据结构?如果有任何相反的证据,我很乐意看到。
答案 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)
我将以一个简单的类比回答。
这两件事中的“更好”是什么?
将所有数据保存在一个大blob中,在计算机缓存中更简单,更明智,更容易。其中包含 N 向量的向量在操作上更复杂(请记住,每个向量都需要动态分配和大小管理操作!);一个向量就是一个向量。您没有将工作负荷乘以 N 。
唯一的缺点是,要使用1D底层数据存储来模拟2D阵列访问,您需要编写外观。幸运的是,这很容易。
现在主观部分:总的来说,除非你真的真的并且你的代码质量并不特别重要,否则我认为这是值得的。
答案 2 :(得分:3)
使用矢量矢量:
通常,使用单个向量会更好,因为内存管理更简单。但是如果你的矩阵很大,你可能会遇到问题,因为很难获得一个大的连续块。
如果您的阵列可以调整大小,那么我仍然坚持使用单个向量:可以在一个可以优化的函数中隔离调整大小的复杂性。
当然,最好的解决方案是使用Boost中提供的线性代数库(BLAS)之类的东西。这也可以很好地处理大型稀疏矩阵。