2

そこで、迷路生成プログラムで使用する n 次元配列構造を作成しようとしています。

問題を単純化しました (テンプレート化して必要なすべてのヘルパー関数を追加する前に、理論を理解しようとする目的で)

したがって、私の問題は現在のところ、次元数を指定するコンストラクターへの引数を受け取る ArbitraryArray クラスを作成したいということです。各次元の長さは 5 になります。 (今のところ)

これは私がこれまでに持っているものです:

class ArbitraryArray{
public:
    int array[5];
    ArbitraryArray*subArray;

    ArbitraryArray(){}

    ArbitraryArray(int depth){
        if (depth == 2) subArray = new ArbitraryArray[5];
        else if (depth > 2) for (int i = 0; i < 5; i++) subArray = new ArbitraryArray(depth - 1);
    }
};

そして、次のような 2 次元オブジェクトを作成します。

ArbitraryArray testArray(2);

または次のような 3 次元オブジェクト:

ArbitraryArray testArray(3);

問題は、深さ = 3 でテストしてから、次の方法で整数値を設定しようとしたときです。

testArray.subArray[3].subArray[4].array[4] = 7;

実行時エラーが発生したため、これらのオブジェクトを動的に割り当てる方法が間違っていると思いました。

また、次のような行で呼び出されるため、空のデフォルト コンストラクターを含めました。

subArray = new ArbitraryArray[5];

これが任意の次元配列データ構造を作成するための最良の方法ではないことは承知していますが、より良い方法を探す前に、この実装が機能しない理由を突き止めたいと思います。

また、次のような行を入れるべきではないことも承知しています。

int array[5];

また、配列の最下位次元より上のすべてのレベルで大量のメモリ割り当てが無駄にならないように、代わりにポインターにする必要があります。そして、この基本的なアイデアが機能するようになったら、それに修正するつもりです。

4

5 に答える 5

5

std::vectorを使用して、正しい量の空白メモリを割り当てるのはどうですか?

sizeof(T) * dim1 * dim2 * dim3 * ...

次に、インデックス付けを処理するヘルパー クラスを作成します。つまり、与えられた(x,y,z,...)からiを計算します。

このアプローチの美しさ、私見は、ポインターをいじる必要がないことにあり、ヘルパークラスは好みのインデックス付けスキーム (優先または優先) を実装するだけです。

編集

std::valarrayを使用すると、 std::sliceおよび/またはstd::gsliceを使用してインデックス作成を計算できるため、作業が簡単になる場合があります。

于 2013-08-15T10:23:10.627 に答える
1

何もコンパイルしていません。目視検査のみです。これはどうですか:

template<int array_length>
class ArbitraryArray{
public:
    int array[array_length];
    ArbitraryArray ** subArray;

    ArbitraryArray(){}

    ArbitraryArray(int depth){
        if (depth == 1)
            subArray = 0;
        else {
            subArray = new ArbitraryArray*[array_length];
            for (int i = 0; i < array_length; i++)
                subArray[i] = new ArbitraryArray(depth - 1);
        }
    }
};
于 2013-08-14T14:55:25.100 に答える
1

さて、一度、depthが 2 より大きい場合、5 つの ArbitraryArrays を作成しますが、それらのすべてのポインターを 1 つの SubArray ポインターに保存します。SubArray は、ArbitraryArrays へのポインターの配列である必要があります。試しArbitraryArray *subArray[5];てみてfor (int i = 0; i < 5; i++) subArray[i] = new ArbitraryArray(depth - 1)、何が起こるかを確認してください。

于 2013-08-14T14:52:52.417 に答える
0

Boostmulti_arrayクラスを使用するだけです。非常に柔軟で効率的で、境界チェックを実行できます。

于 2013-08-15T13:53:45.123 に答える