C++ 用向量的向量来描述一个很长的矩阵,哪个维度应该是最大的?

C++ 用向量的向量来描述一个很长的矩阵,哪个维度应该是最大的?,c++,stl,vector,C++,Stl,Vector,我正在编写使用大型矩阵的代码,其中元素是用户定义的类。为了构建这个矩阵,我使用以下向量向量 using namespace std; vector< vector< userclass > > matrix = vector<vector<userclass> >(sizeX, vector<userclass>(sizeY)); 这个类也可能是一个结构,它将包含一些内置项,比如浮点数和指针。所以,事情是这样的: 假设矩阵在一个方向上

我正在编写使用大型矩阵的代码,其中元素是用户定义的类。为了构建这个矩阵,我使用以下向量向量

using namespace std;
vector< vector< userclass > > matrix = vector<vector<userclass> >(sizeX, vector<userclass>(sizeY));
这个类也可能是一个结构,它将包含一些内置项,比如浮点数和指针。所以,事情是这样的: 假设矩阵在一个方向上有2000个大小,但在另一个方向上只有20个大小,但我完全可以自由选择哪一个。为了获得最佳性能,我应该制作最大的,sizeX还是sizeY

换句话说:大向量的小向量,还是小向量的大向量,哪个更快?有什么区别吗


性能优化应针对单个随机访问。

您应尽可能减少向量数量,这意味着sizeY应大于sizeX以获得最佳缓存性能,更不用说占用更少的空间了

当然,这取决于你打算如何使用它们。如果可以的话,尽量长时间地访问向量-vec[i][j]比vec[j][i]好得多。如果必须执行vec[j][i],那么将sizeX变大可能会有更好的性能,或者使用1个连续数组

最快的迭代,其中sizeX>sizeY:


您应该尽可能减少向量的数量,这意味着sizeY应该大于sizeX以获得最佳缓存性能,更不用说占用更少的空间了

当然,这取决于你打算如何使用它们。如果可以的话,尽量长时间地访问向量-vec[i][j]比vec[j][i]好得多。如果必须执行vec[j][i],那么将sizeX变大可能会有更好的性能,或者使用1个连续数组

最快的迭代,其中sizeX>sizeY:


这里有不同的事情要考虑。首先,您最好定义自己的矩阵类型,该类型包含大小为sizeX*sizeY的单个数据向量,以及将坐标映射到向量中元素位置的运算符。 这种方法的优点是内存占用更紧凑,使用的内存更少1并且内存是连续的

至于应该如何进行映射,主要考虑性能,这取决于数据的使用情况。如果要在特定方向上进行迭代,则要使该方向上的连续元素在内存中占据连续位置,即,如果要在Y上进行外部循环,在X上进行内部循环,则公式应为pos=Y*sizeX+X


1假设类型需要10个字节,20个元素的2000个向量需要2000+1*sizeofvector+2000*20*10个字节,2000个元素的20个向量需要大约20+1*sizeofvector+2000*20*10个字节,2000*20个元素的单个向量需要sizeofvector+2000*20*10个字节。大约在没有额外调试信息的64位版本中,sizeofvector~3*8即24字节,总计为:448024、400504和400024字节。这可能不会有太大的区别,但在第一种情况下,与最佳情况相比,在使用中有额外的10%个内存。

这里有不同的事情要考虑。首先,您最好定义自己的矩阵类型,该类型包含大小为sizeX*sizeY的单个数据向量,以及将坐标映射到向量中元素位置的运算符。 这种方法的优点是内存占用更紧凑,使用的内存更少1并且内存是连续的

至于应该如何进行映射,主要考虑性能,这取决于数据的使用情况。如果要在特定方向上进行迭代,则要使该方向上的连续元素在内存中占据连续位置,即,如果要在Y上进行外部循环,在X上进行内部循环,则公式应为pos=Y*sizeX+X


1假设类型需要10个字节,20个元素的2000个向量需要2000+1*sizeofvector+2000*20*10个字节,2000个元素的20个向量需要大约20+1*sizeofvector+2000*20*10个字节,2000*20个元素的单个向量需要sizeofvector+2000*20*10个字节。大约在没有额外调试信息的64位版本中,sizeofvector~3*8即24字节,总计为:448024、400504和400024字节。这可能没有多大区别,但在第一种情况下,与最佳情况相比,使用的内存增加了10%。

您可能想看看boost的多维数组库,因为它不仅可以更好地使用内存,还可以为您提供标准迭代和其他细节:您可能想看看boost的多维数组库,因为它不仅可以更好地使用内存,还可以为您提供stan
dard迭代和其他细节:使用它们的方式是:一旦创建和设置了非时间敏感的操作,矩阵就只能读而不能写。在运行时,它一次访问一个元素,我无法控制读取哪个元素,也没有理由假设它是顺序的。尽管如此,按照你所说的,拥有几个大的向量让我有更好的机会重复访问同一个向量,即使它只有1/20。使用它们的方式是:一旦创建和设置了非时间敏感的操作,矩阵只会被读取,而不会被写入。在运行时,它一次访问一个元素,我无法控制读取哪个元素,也没有理由假设它是顺序的。尽管如此,按照你所说的,有几个大的向量给了我一个更好的机会,即同一个向量将被重复访问,即使它只有1/20。
for(int i...)
for(int j...) {
  vec[i][j];
}