为什么我不应该使用vector<vector<vector<int>>>?

Why Shouldn't I Use vector<vector<vector<int>>>?

本文关键字:lt gt vector int 不应该 为什么      更新时间:2023-10-16

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

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

只有几个原因:

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

主要的性能缺陷可能是缓存。使用平面阵列可以保证内存是连续的——缓存是令人满意的。有了一个又一个矢量——谁知道呢!

如果您在这里看到瓶颈,这个建议是合理的。如果内存使用率或该向量的访问速度并不关键,那么就走最简单的路吧。

你应该看看Boost.MultiArray,它让你两全其美。

如果出于任何原因你不能使用Boost,我肯定会typedef它:

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

Viktor Sehr和Sbi建议使用单个向量,并使用my_vector[x+y*100+z*100*100]获得元素。为什么会这样?

考虑到尺寸,如果尺寸是固定的,这是合乎逻辑的建议。

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

考虑:

  • 创建所有数组所需的分配数
  • 复制哪怕一个维度的时间
  • 它增加了系统分配器的复杂性
  • 释放所需的时间
  • 常见操作的复杂性,例如填充

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

调整这个(巨大的!)数组的大小可能非常缓慢。如果你想让你的程序运行得最快,你必须了解它将如何运行。元素的复制和销毁复杂性也是一个考虑因素(当使用比int更复杂的东西时)。如果你做了大量的调整大小或插入/删除,那么展平的向量可能会非常慢。

但是,如果它的尺寸是固定的,那么可以比std::vector做得更好。CCD_ 5是一种替代方案。(如果你走std::array的路线,请小心你在堆栈上分配的内容)

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

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