@yacshaが投稿されているので、生ポインタとnew
(またはポインタ)を使用するのではなく、<vector>
をSTLから使用する方がよいでしょう。
しかし、「3次元INT」を作成することはあなたが望む本当にあるなら、あなたはそれらを削除、割り当て、適切にあなたの変数を宣言する必要があります。
#include <iostream>
int main()
{
int b, c, d;
std::cin >> b >> c >> d;
// declaring a variable to a pointer that points to a pointer ... etc.
// really hard to maintain and read
int*** a = new int**[b];
for (int i = 0; i < b; ++i) {
a[i] = new int*[c];
for (int j = 0; j < c; j++) {
a[i][j] = new int[d];
for (int k = 0; k < d; k++)
std::cin >> a[i][j][k];
}
}
// using it like a normal 3d array would be used
for (int i = 0; i < b; i++) {
for (int j = 0; j < c; j++) {
for (int k = 0; k < d; k++)
std::cout << a[i][j][k] << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
// deleting is necessary after using them
for (int i = 0; i < b; i++)
for (int j = 0; j < c; j++)
delete[] a[i][j];
for (int i = 0; i < b; i++)
delete[] a[i];
delete[] a;
}
あなたが見ることができるように、これは悪夢です維持する。 <vector>
を使用する方がはるかに簡単です。なぜなら、コンテナがあなたのメモリ割り当てを処理するからです。 STLを使用したくない場合は、b
,c
,d
がconst
/constexpr
であり、少なくともa[b][c][d]
を使用してください。
これは<vector>
とどのように見えるかです:あなたは、それはあまりにも面倒な宣言を見つけると3Dの配列を初期化するか、ループを経由して、サイズを変更することができればあなたがtypedef
/using
std::vector
を短縮することができ
#include <iostream>
#include <vector>
int main()
{
int b, c, d;
std::cin >> b >> c >> d;
std::vector<std::vector<std::vector<int>>> threeDim(b, std::vector<std::vector<int>>(c, std::vector<int>(d, 0)));
for (const auto x : threeDim) {
for (const auto y : x) {
for (const auto z : y)
std::cout << z << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
}
。
一般に、1次元配列に基づいた専用クラスを使用する方が良いです。 "愚かな行列"を探して、コードを3Dに拡張します。 – o11c