2017-09-16 14 views
0
int b, c, d; 
cin >>b>>c>>d; 
int **a[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]; 
    } 
} 

3次元のintを作成したいと思います.2番目の次元を作成してポインタではなく、3番目の次元を作成することができないと思います。C++で3次元intをポインタで作成するにはどうすればよいですか?

+0

一般に、1次元配列に基づいた専用クラスを使用する方が良いです。 "愚かな行列"を探して、コードを3Dに拡張します。 – o11c

答えて

1

@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,dconst/constexprであり、少なくともa[b][c][d]を使用してください。

これは<vector>とどのように見えるかです:あなたは、それはあまりにも面倒な宣言を見つけると3Dの配列を初期化するか、ループを経由して、サイズを変更することができればあなたがtypedef/usingstd::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'; 
    } 
} 

0

a***a[b](ポインタ、ポインタ、ポインタ)として宣言できます。

int ***a[b]; 
+6

これを行うことで、あなたは超越して[3つ星のプログラマー]になることができます(http://wiki.c2.com/?ThreeStarProgrammer) –

+0

この回答のダウンボッターは、彼らのdownvoteを説明してくださいますか?私は質問に答えた。はい、私はあまりにもトリプルポインターを使用することはダムだと思うが、私はdownvoteを保証する理由を理解していない。 –

0

私はポインタを使用するよりも安全である標準STLを、使用することをお勧め、私は「ベクトルテンプレート」を宣言する必要があります:

#include <vector> 
using std::vector; 

コードは次のようになります。

vector<vector<vector<int>>> A; 
int b, c, d; 
cin >>b>>c>>d; 
int i,j,k; 
A.resize(b);  
for(i=0;i<b;++i){  
    A[i].resize(c); 
    for(j=0;j<c;j++){ 
     A[i][j].resize(d); 
     for(k=0;k<d;k++){ 
      // Optional inputs elements 
      cout << "Input element " <<i<<","<<j<<","<<k<<": "; 
      cin >> A[i][j][k]; 
     } 
    } 
} 
関連する問題