2011-12-20 46 views
2

如何使用動態創建的一維數組通過二維數組引用僅與標準庫?如何使用動態創建的一維數組通過二維數組引用僅與標準庫?

是否可以通過operator []構造重載來完成?

示例: 我想通過創建一維數組形成矩陣,然後以使用二維數組的形式使用它。

// in class, a matrix created by: 
p = new double[m*n](); 

when using it, I'd like to use it like this: 
for(i=0; i<10; i++) 
    for(j=0; j<10; j++) 
     a[i][j] = 0.0; 

我想用的operator []運算符重載和可變測試作證如果「[]」中出現的第一次與否,但高於原來是一個

error: "invalid types double[int] for array subscript "

是有可能這樣做?

+0

準確地說,「p = new double [m * n]();」應該是「a = new double [m * n]();」,對嗎? –

+0

對不起,這是一個ctrl + c,ctrl + p錯誤,它是從一個長程序中部分複製的,p在一個類中使用,並且是在main() – dayu321

+0

作業中?重載[],是的。 – Anycorn

回答

0

如果你不介意類似Fortran的語法,那麼用operator()就可以做到這一點。我喜歡用一個輔助類是這樣的:

template <class T> 
class Indexer2D 
{ 
public: 
    Indexer2D(size_t w, size_t h, T *theData) : 
     width(w), height(h), data(theData) 
    { } 

    T& operator() (size_t row, size_t col) 
    { 
     return data[(width * row) + col]; 
    } 
private: 
    size_t width; 
    size_t height; 
    T *data; 
}; 

你的代碼是這樣:

p = new double[m*n](); 

Indexer2D<double> pMatrix(m, n, p); 
pMatrix(1,4) = 23.9; 

這給了你很好的語法以最小的內存分配。它不檢查你的界限,但這很容易做到。如果你需要最小的重量,你也不必儲存高度。

1

我建議任一使用手動指數計算:

a = new double[m*n](); 

for(i=0; i<10 && i<m; i++) 
    for(j=0; j<10 && j<n; j++) 
     a[i*n+j] = 0.0; 

反向計算值將是:i = index/n, j = index % n

或者,使用的valarray:

#include <valarray> 
// .... 

    a[std::slice(i, n, m)][j] = 0.0; 

更好的結果可使用std::gslice可以實現(這是概括切片,接受多個維度)。 我現在沒有時間制定完整的示例。

下面是N.約祖蒂斯到一個相當強大的樣品鏈接:

+0

添加了一個鏈接到更多的示例 – sehe

0

如果你可以使用額外的內存,你可以這樣做:

// Allocate 1D array 
double * p = new double[m*n](); 
// Allocate pointers for 2D reference 
double ** p2D = new double *[m]; 

// set 2D pointers to allocated memory 
for (i = 0; i < m; i++) 
    p2D[i] = &p[i * n]; 

for(int i=0; i<m; i++) 
    for(int j=0; j<n; j++) 
     p2D[i][j] = 0.0;