c++vectorまたはポインタを使用して多次元配列を作成する
STL vector
この方法の利点は、メモリを手動で解放する必要がなく、配列サイズを動的に変更できることです(通常、多次元配列を使用する場合、そのサイズは変更されません).欠点は、比較的醜いことであり、vectorの列が長いこと、特に
ししん
このような配列は簡潔明瞭であるが,自分で手動でメモリを解放するには順序が間違っていないため,問題が発生しやすい.
リファレンス
http://www.cplusplus.com/forum/articles/7459/
#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/