簡體   English   中英

保留“塊”的C ++ 3D矢量

[英]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>作為您的矩陣類型(並逐步訪問它); 現在你可以真正實際矩陣預留空間的前期-但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個獨立的內存塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM