2010-02-01 76 views

Trả lời

58

Các mảng trong câu hỏi của bạn chỉ có một phần tử, vì vậy bạn chỉ cần một giá trị hoàn toàn khởi nó. Bạn cần ba bộ niềng răng, một cho mỗi kích thước của mảng.

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

Một ví dụ rõ ràng hơn có thể là:

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

Như bạn có thể thấy, có hai nhóm, mỗi chứa ba nhóm 4 số.

+1

Có, tất nhiên bạn nói đúng, một số mảng D này giúp tránh né tôi ... –

+0

Điều đó có hiệu quả trong C không? – miguelSantirso

+2

Có điều đó cũng sẽ hoạt động trong C. –

8

Thay vì mảng đa chiều tĩnh, có lẽ bạn nên sử dụng mảng một chiều và tính toán chỉ mục theo phép nhân. Ví dụ.

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 phân bổ lưu trữ động, đó là điều tốt vì không gian ngăn xếp thường rất hạn chế và mảng 3D dễ dàng sử dụng nhiều không gian. Gói nó trong một lớp như thế cũng làm cho việc truyền mảng (bằng cách sao chép hoặc tham chiếu) đến các hàm khác tầm thường, trong khi thực hiện bất kỳ việc truyền các mảng tĩnh đa chiều nào là rất có vấn đề.

Đoạn mã trên chỉ đơn giản là một ví dụ và nó có thể được tối ưu hóa và hoàn thiện hơn. Cũng chắc chắn có những triển khai hiện tại của điều này trong các thư viện khác nhau, nhưng tôi không biết gì cả.

+1

Đối với các thư viện hiện có, có Boost.MultiArray và Boost.uBlas (www.boost. org). Sau này được thiết kế phù hợp hơn với đại số tuyến tính. Hãy suy nghĩ về Tăng cường như là một phần mở rộng của thư viện C++ chuẩn (hoặc "Những thứ họ rời khỏi ngôn ngữ và thư viện chuẩn (TM)"). –

+0

@Emile: Tôi đã không downvote, nhưng 'new int [2] [3] [4]' sẽ làm các trick. Đối với mã của @ Tronic, nó chỉ sao chép nỗ lực của 'std :: valarray'. – Potatoswatter

+1

std :: vector cơ bản là một trình bao bọc RAII đẹp cho [] mới/xóa [] (và nó cũng thực hiện một vài thứ khác) vì vậy tôi luôn thích nó hơn là quản lý bộ nhớ theo cách thủ công. Cấp, ở đây nó lãng phí một vài byte để theo dõi kích thước container, nhưng mặt khác bạn có thể sử dụng để tính toán kích thước mảng 3D. Tôi không thấy những gì std :: valarray đã làm với điều này, như tôi đã không được xác định bất kỳ hoạt động số học cho mảng và valarray không biết làm thế nào để xuất hiện như là một mảng đa chiều. – Tronic

3

Mọi người dường như quên std::valarray. Đó là mẫu STL cho các mảng đa chiều phẳng, và lập chỉ mục và cắt chúng.

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

Không khởi tạo tĩnh, nhưng điều đó có thực sự cần thiết không?

+0

Nhận xét/câu trả lời của bạn khiến tôi phát sinh câu hỏi về std :: valarray: http://stackoverflow.com/questions/2187648/how-can-i-use-a-stdvalarray-to-store-manipulate-a-2d- mảng –

6

Dưới đây là một cách khác để phân bổ động mảng 3D trong C++.

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; 
     } 
    } 
} 
Các vấn đề liên quan