2013-08-24 73 views
0

考慮類型2數組聲明的:用x在內存中設置的2d數組與模擬2d數組的1d數組連續相似嗎?

T x [rows * cols]; // type 1 
T y [rows][cols]; // type 2 

我通常使用第一類型(類型1)其中,然後我知道到索引[行* COLS + COL]

然而,如果我想將2d數組複製到模擬2d數組的1d數組中,例如:copy type2 - > type1。如果這些內容保證在內存中以相同的方式佈置,我可以只對另一個執行一個memcpy?目前我有一個循環,但如果內存是相同的佈局,我想我可以只做一個memcpy。考慮下面的公共構造函數。

public: 
    // construct a matrix from a 2d array 
    template <unsigned int N, unsigned int M> 
    Matrix (T (&twoDArray)[N][M] ) : rows_(N), cols_(M), matrixData_(new T[rows_*cols_]) 
    { 
    // is there a refactor here? Maybe to memcpy? 
    for (unsigned int i = 0; i < rows_ ; ++i) 
    { 
     for (unsigned int j = 0; j < cols_ ; ++j) 
     { 
     matrixData_[ i * cols_ + j ] = twoDArray[i][j]; 
     } 
    } 
    } 

    private: 
    unsigned int rows_; 
    unsigned int cols_; 
    T* matrixData_; 
+2

「類型2」甚至不是合法的C++。 –

+1

你想要: 'T ** y = new T * [row]; // type 2' – smac89

+3

@ Smac89:沒人願意。 –

回答

2

一個2d數組(你聲明的類型)在內存中保證是連續的。這並不意味着你應該使用memcpy。特別是不在像你這樣的模板中,因爲memcpy可能無法正確工作,因爲T。你可以保留你擁有的東西。這裏是我可能會寫,雖然它(如果你不能使用C++ 11,那麼就使用一個規則計數for循環):

template <unsigned int N, unsigned int M> 
Matrix (T (&twoDArray)[N][M] ) : rows_(N), cols_(M), matrixData_(new T[rows_*cols_]) 
{ 
    T * out = matrixData_; 
    for (auto const & sub : twoDArray) 
     out = std::copy(std::begin(sub), std::end(sub), out); 
} 

或者更好的是,只使用std::vector。然後,您不必實現複製構造函數,賦值運算符或析構函數。 (你已經實現了所有這三個,對吧?)

+0

是的,自從我使用C++ 11以來,我已經全部使用了5個。我試圖保持連續的內存的速度,並試圖看看我是否可以做到這一點,而不使用矢量>但似乎c + +不允許你用多於一個參數重載operator [],所以你不能像做M [1,1] = 5 '//不可改變 常量T *運算符[](無符號整型行,無符號整型COL)常量 { 返回matrixData_ [行* cols_ +山口]; } //可變的 T *運算符[](無符號整數行,無符號整數列) { return matrixData_ [row * cols_ + col]; } ' – bjackfly

+0

對此有何看法?非常酷的收集循環你放在那裏,我喜歡它。 – bjackfly

+0

@bjackfly:我並不是想用'vector'來代替矩陣類。我的意思是在課堂上使用'vector' *,而不是手動管理內存。 –

3

這取決於,但通常編譯器會做一個簡單的T x [行] [列]行爲就像T x [行*列。除非你動態聲明內存如

T** x = new T*[rows]; 
for (int i = 0; i < rows; ++i) 
    x[i] = new T[columns]; 

在這個例子中它們是不同的。