programing

C++에서 3D 어레이를 초기화하는 방법

bestprogram 2023. 8. 30. 21:53

C++에서 3D 어레이를 초기화하는 방법

C++에서 3D 어레이를 초기화하는 방법

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way

질문의 배열에는 요소가 하나만 있으므로 완전히 초기화하려면 하나의 값만 있으면 됩니다.배열의 각 차원에 대해 하나씩, 세 세트의 중괄호가 필요합니다.

int min[1][1][1] = {{{100}}};

더 명확한 예는 다음과 같습니다.

int arr[2][3][4] = { { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} },
                     { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} } };

보시는 바와 같이 두 그룹이 있으며, 각 그룹에는 4개의 숫자로 구성된 세 그룹이 포함되어 있습니다.

정적 다차원 배열 대신 1차원 배열을 사용하고 곱셈으로 인덱스를 계산해야 합니다.예.

class Array3D {
    size_t m_width, m_height;
    std::vector<int> m_data;
  public:
    Array3D(size_t x, size_t y, size_t z, int init = 0):
      m_width(x), m_height(y), m_data(x*y*z, init)
    {}
    int& operator()(size_t x, size_t y, size_t z) {
        return m_data.at(x + y * m_width + z * m_width * m_height);
    }
};

// Usage:
Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100
arr(8, 12, 17) = 3;

std::vector는 스토리지를 동적으로 할당합니다. 이는 스택 공간이 매우 제한적인 경우가 많고 3D 어레이가 많은 공간을 쉽게 사용하기 때문입니다.이와 같은 클래스로 래핑하면 (복사 또는 참조를 통해) 배열을 다른 함수로 전달하는 것이 사소한 반면, 다차원 정적 배열을 전달하는 것은 매우 문제가 됩니다.

위의 코드는 단순한 예시이며 최적화되고 더 완벽하게 만들 수 있습니다.다양한 도서관에서 이것을 실행하는 것은 확실히 존재하지만, 저는 전혀 모릅니다.

여기 C++에서 3D 배열을 동적으로 할당하는 다른 방법이 있습니다.

int dimX = 100; int dimY = 100; int dimZ = 100;
int*** array;    // 3D array definition;
// begin memory allocation
array = new int**[dimX];
for(int x = 0; x < dimX; ++x) {
    array[x] = new int*[dimY];
    for(int y = 0; y < dimY; ++y) {
        array[x][y] = new int[dimZ];
        for(int z = 0; z < dimZ; ++z) { // initialize the values to whatever you want the default to be
            array[x][y][z] = 0;
        }
    }
}

모두들 잊어버리는 것 같습니다.std::valarray평평한 다차원 배열을 위한 STL 템플릿입니다. 그리고 그것들을 인덱싱하고 슬라이싱합니다.

http://www.cplusplus.com/reference/std/valarray/

정적 초기화는 없지만, 이것이 정말 필수적입니까?

언급URL : https://stackoverflow.com/questions/2178909/how-to-initialize-3d-array-in-c