2

標準ライブラリだけで二次元配列参照で動的に作成した一次元配列を使う方法は?</p>

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

例: 1 次元配列を作成して行列を形成し、それを 2 次元配列を使用する形式で使用したい。

// 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 []「[]」が初めて出現したかどうかを証明するために、演算子のオーバーロードと変数テストを使用することを考えましたが、上記は

エラー: 「double[int]配列添え字の型が無効です」

そうすることは可能ですか?

4

3 に答える 3

1

operator()Fortran のような構文を気にしなければ、これを行うのは簡単です。次のようなヘルパー クラスを使用するのが好きです。

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;

これにより、最小限のメモリ割り当てで優れた構文が得られます。境界をチェックするわけではありませんが、チェックするのは簡単です。最小限の重量が必要な場合は、高さも保存する必要はありません。

于 2011-12-20T14:44:50.583 に答える
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. Josuttis による非常に強力なサンプルへのリンクを次に示します。

于 2011-12-20T10:12:23.143 に答える
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; 
于 2011-12-20T14:30:23.133 に答える