假设我需要不确定数量的3乘4矩阵。 (或者是任何其他固定的m×by-n维矩阵的序列。)我首先想到的是将这些矩阵存储在std::vector
中,其中每个矩阵本身都是std::vector<std::vector<double> >
。如何使用std::vector::reserve()
为这些矩阵中的数字(例如x
)预分配空间?因为我知道两个维度,我应该(或者我想)能够x
倍于这些块的大小。
我知道如何在1D std::vector
中实现此对象,但我想知道如何在3D std::vector
中执行此操作,如果没有其他原因,请更好地学习如何使用std::vector
类。
答案 0 :(得分:1)
将矩阵存储为向量矢量可能效率很低,但如果必须,那就去吧。保留空间与以往一样:
typedef std::vector<std::vector<int>> matrix_type;
std::vector<matrix_type> collection;
collection.reserve(100); // set capacity for 100 "matrices"
// make 10 4x3-matrices; `collection` won't reallocate
collection.resize(10, matrix_type(4, std::vector<int>(3)));
对于你的基类型,你可能更好的是拥有一个m * n
元素的向量并且可以大步访问它,即(i,j) th 元素就位i * n + j
。每个向量本身都是一个动态容器,你可能不希望所有的动态分配到处都是。
同样地,上面的reserve
调用可能没有你想的那样,因为它只为内部向量的簿记数据保留记忆(通常每个向量三个单词,即300个单词),并且< em> not 表示实际数据。
有鉴于此,您甚至可以考虑将std::array<int, m*n>
作为矩阵类型(并以步幅方式访问它);现在你可以实际预留实际矩阵的空间 - 但m
和n
现在必须是编译时常量。
答案 1 :(得分:0)
更好的方法是提供类接口,并为整个矩阵使用单个线性内存块。然后,您可以通过不同的方式实现该接口,范围从适当大小的内部数组(如果大小是大小的一部分),或通过提供索引(std::vector<int>
)单个pos = row*cols + col
。
在std::vector< std::vector<int> >
方法中,外部向量将分配内存来存储内部向量,并且每个向量将分配内存以保存其自己的元素。使用原始指针,内存布局类似于:
int **array = new int*[ N ];
for ( int i = 0; i < N; ++i )
array[i] = new int[ M ];
那是:
[ 0 ] -------> [ 0, 1, 2, ... ]
[---]
[ 1 ] -------> [ 0, 1, 2, ... ]
[ . ]
[ . ]
或基本上N + 1个独立的内存块。