0

假设我需要数量不定的 3×4 矩阵。(或任何其他固定 m×n 维矩阵的序列。)我的第一个想法是将这些矩阵存储在 astd::vector中,其中每个矩阵本身就是 a std::vector<std::vector<double> >。我如何使用这些矩阵std::vector::reserve()中的一个数字来预先分配空间?x因为我知道其中的两个维度,所以我应该(或者我希望)能够x乘以这些块的大小。

我知道如何在 1D 中实现这个对象std::vector,但我想知道如何在 3D 中实现它std::vector,如果没有其他原因,只是为了更好地学习如何使用std::vector该类。

4

2 回答 2

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元素将位于 position i * n + j。每个向量本身都是一个动态容器,您可能不希望到处都有那么多动态分配。

同样,上述reserve调用可能不会像您想的那样做,因为它只为内部向量的簿记数据(通常每个向量三个字,即 300 个字)保留内存,而不是为实际数据保留内存。

有鉴于此,您甚至可能希望将 astd::array<int, m*n>视为您的矩阵类型(并大步访问它);现在您实际上可以预先为实际矩阵保留空间 - 但m现在n必须是编译时常量。

于 2012-05-07T23:16:38.540 回答
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 个单独的内存块。

于 2012-05-07T23:32:26.380 回答