为什么我不应该使用vector <vector <vector <int>&gt;&gt;?</vector <vector <int>

时间:2012-02-04 09:46:45

标签: c++ vector

我刚刚读了一个关于初始化多维向量(question)的问题,而Viktor Sehr和Sbi反而使用单个向量并使用my_vector[x+y*100+z*100*100]获取元素。为什么是这样?是出于性能原因吗?如果是这样,它如何提高性能?先谢谢你,

编辑:当宽度/高度/深度不相同且可以改变时,这些原因是否仍然适用?

4 个答案:

答案 0 :(得分:8)

只有几个原因:

它浪费空间,速度慢(不可预测的内存访问,缓存浪费等),它很麻烦

主要的性能缺点可能是缓存。对于平面阵列,您可以保证内存是连续的 - 缓存很快乐。矢量矢量 - 谁知道!

答案 1 :(得分:4)

如果您在这里看到瓶颈,这个建议是合理的。如果此向量的内存使用或访问速度并不重要,请沿着最简单的道路前进。

你应该看看Boost.MultiArray,它可以为你提供最好的两个世界。

如果由于某种原因你无法使用Boost,我绝对会typedef

typedef vector<vector<vector<int> > > My3DIntVector;

My3DIntVector v;

答案 2 :(得分:2)

  

... Viktor Sehr和Sbi反而使用单个向量,并使用my_vector [x + y * 100 + z * 100 * 100]获取元素。这是为什么?

根据尺寸,如果尺寸固定,则为逻辑推荐

  

是出于性能原因吗?如果是这样,它如何提高性能?

考虑:

  • 创建所有数组所需的分配数
  • 复制甚至一个维度的时间
  • 它添加到系统分配器的复杂性
  • 释放时间
  • 常见操作的复杂性,例如填写
  

编辑:当宽度/高度/深度不相同且可以改变时,这些原因是否仍然适用?

调整此(大量!)数组的大小可能非常慢。如果您希望程序最快,您必须了解程序的运行方式。元素的复制和破坏复杂性也是一个考虑因素(当使用比int更复杂的东西时)。如果你做了很多调整大小或插入/删除,那么展平的向量可能非常慢。

但是,如果其尺寸已修复,则可以比std::vector更好地 std::array是另一种选择。 (如果你走std::array的路线,要小心你在堆栈上分配的东西)

答案 3 :(得分:0)

我唯一可以想象的是,这是一个很大的内存块,因此可以防止内存碎片。这更容易缓存。

vector<vector<vector<int> > >包含大量内存块:第一个向量的块,vector<>中每个元素的块和vector<vector<>>中每个元素的块。这不容易缓存,并且可能产生难以预测的内存使用。