2

(注:私は現在C ++を学んでいるので、私がしていることを行うためのより良い方法があれば、説明が役立つでしょう。)

私はC/C++でコンウェイのライフゲームを作成しています。次のコードがあります。

bool ** previous;
bool ** current;

void init() {
    previous = new bool*[width];
    current = new bool*[width];
    for (int i =0; i < width; i++) {
        previous[i] = new bool[height];
        current[i] = new bool[height];
    }
}

動的配列の理由は、幅と高さが実行時にユーザーによって指定されるためです。1次元配列がある場合、次のことができます。

bool * previous;
bool * current;

void () {
    bool * temp = current;
    current = previous;
    previous = temp;
}

ただし、このアプローチは、2次元配列では期待どおりに機能しません。技術的には配列の配列であるため、各サブ配列ポインターを個別に交換する必要がありますか?多次元配列を定義してそれらを交換するためのより良い方法はありますか?

編集:私はまだC ++固有の機能を実際に使用していないので、純粋なCでこれを実行できるのであれば、それをお勧めします。

4

5 に答える 5

3

ここでは、配列の配列を気にする本当の理由はありません。特に、多くのメモリ管理を処理する標準ライブラリコンテナの使用を避けたため、適切に維持および破棄するのは非常に多くの作業です。

通常width * height、単一の配列にセルを割り当てて、列がどこにあるか、行がcell[x + width * y]どこにあるかのようにセルを参照する方が簡単です。xy

この問題の特定のケースでは、必要なのはビットの配列であり、ブール値の配列ではないことに注意してください。C ++には、使用する価値のあるビットセット用の特殊なケースのコンテナーがありstd::vector<bool>ます。

于 2012-11-02T14:30:48.517 に答える
1

これは機能します:

int arr1[10][10],arr2[10][10]

//Swap 2nd row between arrays
std::swap(arr1[2], arr2[2]);
于 2013-04-19T17:22:15.377 に答える
0

C ++の場合は、を使用しstd::vector、ヒープ割り当て、純粋な配列、それらのmemcpy、およびコピー/代入演算子を忘れてください。

于 2012-11-02T14:28:30.873 に答える
0

配列の配列を使用する代わりに、サイズの1次元配列を使用してみませんwidth*heightか?

で要素にアクセスするだけですy*width + x

いつものように配列を割り当てmalloc(width*height*sizeof(bool))ます。これはあなたの問題には十分なはずです

于 2012-11-02T14:30:31.530 に答える
0

以前の回答は技術的には正しいものですが、元の質問には回答していないようです。「このアプローチは2次元配列では期待どおりに機能しない」とおっしゃっていますが、なぜ次のように機能しないのでしょうか。

void () {
    bool ** temp = current;
    current = previous;
    previous = temp;
}

C ++機能を使用してもかまわない場合は、std::swap関数が便利です。

std::swap(current, previous);
于 2012-11-03T00:02:24.140 に答える