C++ 3D 矢量保留"blocks"

C++ 3D vector preserving "blocks"

本文关键字:blocks 保留 3D C++      更新时间:2023-10-16

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

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

将矩阵存储为向量的向量可能效率很低,但如果必须这样做,那就去做吧。预留空间与往常相同:

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

同样,上面的reserve调用可能不会像你想象的那样,因为它只为内部向量的记账数据保留内存(通常每个向量三个单词,即 300 个单词),而不是实际数据。

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

更好的方法是提供一个类接口,并为整个矩阵使用单个线性内存块。然后,您可以通过不同的方式实现该接口,范围从适当大小的内部数组(如果大小是大小的一部分)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 个单独的内存块。