[英]C++ 3D vector preserving “blocks”
假設我需要不確定數量的3×4矩陣。 (或任何其他固定的m×n維矩陣的序列。)我的第一個想法是將這些矩陣存儲在std::vector
,其中每個矩陣本身就是std::vector<std::vector<double> >
。 如何使用std::vector::reserve()
為這些矩陣中的某個數字(例如x
std::vector::reserve()
預分配空間? 因為我知道兩個尺寸,我應該(或我想)要能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>
作為您的矩陣類型(並逐步訪問它); 現在你可以真正實際矩陣預留空間的前期-但m
和n
現在必須編譯時間常數。
更好的方法是提供一個類接口,並對整個矩陣使用單個線性存儲塊。 然后,您可以以不同的方式實現該接口,范圍從適當大小的內部數組(如果大小是大小的一部分),或者通過提供索引來實現單個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個獨立的內存塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.