c++vectorまたはポインタを使用して多次元配列を作成する


STL vector
#include 
using namespace std;

int main() {
    // construct array2D[HEIGHT][WIDTH]
    vector > array2D;

    array2D.resize(HEIGHT);
    for (int i = 0; i < HEIGHT; ++i)
        array2D[i].resize(WIDTH);


    // construct array3D[HEIGHT][WIDTH][DEPTH]
    vector > > array3D;

    array3D.resize(HEIGHT);
    for (int i = 0; i < HEIGHT; ++i) {
        array3D[i].resize(WIDTH);
        for (int j = 0; j < WIDTH; ++j)
            array3D[i][j].resize(DEPTH);
        }

    return 0;
}

この方法の利点は、メモリを手動で解放する必要がなく、配列サイズを動的に変更できることです(通常、多次元配列を使用する場合、そのサイズは変更されません).欠点は、比較的醜いことであり、vectorの列が長いこと、特に> >が一緒に接続できないことである.そうしないと、コンパイラは、c++11で一緒に書くことができるにもかかわらず、シフトまたはストリーム抽出演算子と見なされる.
ししん
int main() {
    // construct p2DArray[HEIGHT][WIDTH]
    double **p2DArray;

    p2DArray = new double*[HEIGHT];
    for (int i = 0; i < HEIGHT; ++i)
        p2DArray[i] = new double[WIDTH];

    for (int i = 0; i < HEIGHT; ++i)
        delete [] p2DArray[i];
    delete [] p2DArray;


    // construct p3DArray[HEIGHT][WIDTH][DEPTH]
    int ***p3DArray;

    p3DArray = new int**[HEIGHT];
    for (int i = 0; i < HEIGHT; i++) {
        p3DArray[i] = new int*[WIDTH];
        for (int j = 0; j < WIDTH;j++) {
            p3DArray[i][j] = new int[DEPTH];
        }
    }

    for (int i = 0; i < HEIGHT; ++i) {
        for (int j = 0; j < WIDTH; ++j) {
            delete [] p3DArray[i][j];
        }
        delete [] p3DArray[i];
    }
    delete [] p3DArray;
}

このような配列は簡潔明瞭であるが,自分で手動でメモリを解放するには順序が間違っていないため,問題が発生しやすい.
リファレンス
http://www.cplusplus.com/forum/articles/7459/