2011-12-20 4 views
2

2次元配列参照によって動的に作成された1次元配列を標準ライブラリで使用する方法標準ライブラリでのみ2次元配列参照で動的に作成された1次元配列を使用する方法

operator []の構成オーバーロードによってこれを行うことはできますか?

例: 1次元配列を作成して2次元配列を使用する形で行列を作成したいと考えています。 「[]」初登場かが、上記

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

であることが判明した場合、私は、オペレータ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; 

それは可能ですか?私は手動でインデックスの計算を使用してのいずれかをお勧め

+0

正確には、 "p = new double [m * n]();" "a = new double [m * n]();"、そうでしょうか? –

+0

申し訳ありません、ctrl + c、ctrl + pの間違いです。長いプログラムから部分的にコピーされました。pはクラスで使用され、aはmain() – dayu321

+0

宿題ですか?オーバーロード[]、はい。 – Anycorn

答えて

0

Fortranのような構文を気にしない場合は、operator()でこれを行うのは簡単です。これはあなたに最小限のメモリ割り当てを持つ素敵な構文を与える

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

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

:あなたのコードは次のようになり

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; 
}; 

:私はこのようなヘルパークラスを使用するようにしたいです。それはあなたの境界をチェックしませんが、そうするのは簡単でしょう。最小限の体重が必要な場合は、身長を保存する必要はありません。

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; 

逆Calcは次のようになります。またi = index/n, j = index % n

、valarrayの使用:

#include <valarray> 
// .... 

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

より良い結果がstd::gsliceを使用して達成することができます一般化スライス、複数の寸法を受け入れる)。 今私は完全な例を試す時間がありません。ここで

はN. Josuttis氏によって非常に強力サンプルへのリンクです:

+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; 
関連する問題