Dưới đây là cách đơn giản để tạo mảng 3D sử dụng C hoặc C++ trong một đoạn bộ nhớ cho mỗi mảng. Không cần phải sử dụng BOOST (ngay cả khi nó tốt đẹp), hoặc để phân chia phân bổ giữa các dòng với nhiều sự gián đoạn (điều này là khá xấu vì nó thường cho hình phạt hiệu suất lớn khi truy cập dữ liệu và nó mảnh bộ nhớ).
Điều duy nhất cần hiểu là không có những thứ như mảng đa chiều, chỉ mảng của mảng (của mảng). Chỉ số trong cùng là bộ nhớ xa nhất trong bộ nhớ.
#include <stdio.h>
#include <stdlib.h>
int main(){
{
// C Style Static 3D Arrays
int a[10][20][30];
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
}
{
// C Style dynamic 3D Arrays
int (*a)[20][30];
a = (int (*)[20][30])malloc(10*20*30*sizeof(int));
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
free(a);
}
{
// C++ Style dynamic 3D Arrays
int (*a)[20][30];
a = new int[10][20][30];
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
delete [] a;
}
}
Đối với vấn đề thực tế của bạn, vì có thể có hai thứ nguyên không xác định, có vấn đề với đề xuất của tôi tại nó chỉ cho phép một thứ nguyên không xác định. Có một số cách để quản lý điều đó.
Tin tốt là sử dụng các biến hiện hoạt động với C, nó được gọi là các mảng độ dài biến đổi. Bạn nhìn here để biết chi tiết.
int x = 100;
int y = 200;
int z = 30;
{
// C Style Static 3D Arrays
int a[x][y][z];
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
}
{
// C Style dynamic 3D Arrays
int (*a)[y][z];
a = (int (*)[y][z])malloc(x*y*z*sizeof(int));
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
free(a);
}
Nếu sử dụng C++ cách đơn giản nhất có lẽ là sử dụng toán tử quá tải gắn bó với cú pháp mảng:
{
class ThreeDArray {
class InnerTwoDArray {
int * data;
size_t y;
size_t z;
public:
InnerTwoDArray(int * data, size_t y, size_t z)
: data(data), y(y), z(z) {}
public:
int * operator [](size_t y){ return data + y*z; }
};
int * data;
size_t x;
size_t y;
size_t z;
public:
ThreeDArray(size_t x, size_t y, size_t z) : x(x), y(y), z(z) {
data = (int*)malloc(x*y*z*sizeof data);
}
~ThreeDArray(){ free(data); }
InnerTwoDArray operator [](size_t x){
return InnerTwoDArray(data + x*y*z, y, z);
}
};
ThreeDArray a(x, y, z);
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
}
Đoạn mã trên có một số chi phí gián tiếp để truy cập InnerTwoDArray (nhưng một trình biên dịch tốt có lẽ có thể tối ưu hóa nó đi) nhưng chỉ sử dụng một bộ nhớ cho mảng được cấp phát trên heap. Đó thường là lựa chọn hiệu quả nhất.
Rõ ràng ngay cả khi mã trên vẫn đơn giản và dễ hiểu, STL hoặc BOOST làm tốt, do đó không cần phải phát minh lại bánh xe. Tôi vẫn tin rằng nó là thú vị để biết nó có thể dễ dàng thực hiện.
Đào xương cũ, tôi biết ... nhưng tại sao mọi người sử dụng C++ khi những thứ "cơ bản" như mảng nhiều chiều đến miễn phí với các ngôn ngữ bậc cao khác? Có điều gì đó mà bạn phải sử dụng C++ để bàn tay của bạn bị trói sau lưng? Hiệu suất? – MikeMurko
Xin chào MikeMurko, tại thời điểm này, lý do gắn tay sẽ là chính xác nhất. Tôi sẽ không kém phần hạnh phúc khi làm điều gì đó như thế này trong Java hoặc C#. – AndyUK