daviddr

小學生(200/1000)
UID 4114704
精華
0
積分 590
帖子 594
潛水 762 米
閱讀權限 20
註冊 2008-5-3 來自 Taiwan
|
|
|
伊莉遊戲
動態陣列配置
好的 coder 總是有辦法以 1D array 來駕馭高維陣列操作,
但有時使用高維陣列,可讓 code 中的邏輯概念更加清晰。
早期的 C 或目前的 C++ 中,無動態陣列配置的語法,
(在 C99 中才有,例如 gcc 與 dev C++ 皆可編譯動態陣列)
因此需要自己實現,底下是我的簡單作法:
設計陣列配置時有 3 點需考量:
1. 配置效率: 最好只呼叫一次 malloc 或 new。
2. 存取效率: 存取速度必須逼近 primary array。
3. 語意: array 的記憶體必須連續分佈。
(所以 vector< vector<T> > 不能算是真正的陣列,
他只是 array container... )
N維動態陣列配置較複雜,先從二維的寫起 ^^;
(1) 使用 C 語言:
void** new_arr (int size, int x, int y) //size = 元素大小
{
void** a=0; char* p;
int sz = sizeof (void*);
if (!(a= (void **) malloc (sz*x + size*x*y))) return 0;
p = (char*)a + sz * x;
while (x--) a[x] = p + size*x*y;
return a;
}
void del_arr (void** a)
{
if (a) free (a);
}
void set_arr (void** a, int size, int n, ...)
{
va_list p;
va_start (p, n);
memcpy (a[0], p, size*n);
}
void main ()
{
typedef struct {float f; char c;} CC;
CC cc[4] = {0.2,'a', 0.4,'b', 0.6,'c', 0.8, 'd'};
int sz;
int **a;
char* **b;
CC **c;
a = (int**) new_arr (sz = sizeof(int), 2,4);
set_arr ((void**)a, sz, 2*4,
1,2,3,4, //依序輸入資料
7,8,9,0
);
printf ("%d", a[1][2]);
b = (char***) new_arr (sz = sizeof(char*), 2,2);
set_arr ((void**)b, sz, 2*2,
"陣列","2D", //依序輸入資料
"輸入","範例"
);
printf ("\n%s", b[0][1]);
c = (CC**) new_arr (sz = sizeof(CC), 2,2);
set_arr ((void**)c, sz, 2*2,
cc[0], cc[1], //依序輸入資料
cc[2], cc[3]
);
printf ("\n%f %c", c[1][0].f, c[0][0].c);
del_arr ((void**)a);
del_arr ((void**)b);
del_arr ((void**)c);
}
(2) 使用 C++:
[code]template <class T> struct Array
{
[ 瀏覽完整內容請先註冊或登入會員。]
|
|
|