2017-09-16 51 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.I認爲問題是當我創建第二個維度時,它不是一個指針,我無法創建第3個維度。如何用C++中的指針創建3維int?

+0

通常使用由單維數組支持的專用類更好。查找「傻矩陣」,然後將代碼擴展到3D。 – o11c

回答

1

正如@yacsha發佈,你最好使用STL的<vector>,而不是使用原始指針和new(甚至是指針)。

但是,如果創造一個「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,至少使用a[b][c][d],其中b,cdconst/constexpr

這是怎麼看起來像<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'; 
    } 
} 

你可以typedef/using縮短std::vector如果你覺得太麻煩了聲明和初始化的三維陣列,或者您也可以通過循環調整其大小。

0

您可以將a聲明爲***a[b](指向指向指針的指針)。

int ***a[b]; 
+6

通過這樣做你可以超越併成爲[三星程序員](http://wiki.c2.com/?ThreeStarProgrammer) –

+0

這個答案的落後者請解釋他們的downvote?我回答了問題。是的,我也認爲使用tripple-pointers是愚蠢的,但我不明白爲什麼這是一個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]; 
     } 
    } 
}