2017-09-16 3 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를 작성하고 싶습니다. 두 번째 차원을 작성할 때 포인터가 아니고 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>와 같은 모습입니다 : 당신이 너무 복잡 선언 발견하고 차원 배열을 초기화하기, 또는 루프를 통해 크기를 조정할 수 있다면 당신은 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

이 대답의 다운 voter는 그들의 downvote를 설명 해주시겠습니까? 나는 질문에 대답했다. 그렇습니다, 나는 또한 tripple-pointers를 사용하는 것이 바보 같다고 생각하지만, 왜 그것이 downvote를 보증하는지 이해하지 못합니다. –

0

나는 포인터를 사용하는 것보다 안전 표준 STL을 사용하는 것이 좋습니다, 그래서 "벡터 템플릿"선언 할 것이다 :

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]; 
     } 
    } 
} 
:

#include <vector> 
using std::vector; 

이 코드의 모습을