在动态扩充数组问题中,c标准采用relloc()函数加以实现,但存在地址迁移的问题。与之类似,stl中vector的resize采用的方法是新开辟一段空间,将原来的数据移动到新开辟空间中。想要既能享受空间灵活性,不造成大量空间的浪费,又能解决地址风险的方式是动态数组。只需要一维指针数组的空间,就能扩展到二维大空间。
/*
* dynamic_array.h
* 动态数组头文件
* 分配空间后,元素地址不会再度改变
* Copyright (C), C.D.
* 2016.4.5 19:41
* Ver 1.0
*/
#ifndef _DYNAMIC_ARRAY_H
#define _DYNAMIC_ARRAY_H
#define MAX_ARRAY_NUM 1024
#define ARRAY_SIZE 1024
template <class T>
class DYN_ARRAY
{
T item_array[ARRAY_SIZE];
};
DYN_ARRAY<int> *pArray[MAX_ARRAY_NUM];
int iSize; // 目前动态数组的大小
/*
* 访问指定索引的位置
*/
template <class T>
T *get(int index)
{
if(index >= 0 && index < iSize)
{
int major_idx = index / ARRAY_SIZE;
int minor_idx = index % ARRAY_SIZE;
return &(pArray[major_idx]->item_array[minor_idx]);
}
return NULL;
}
/*
* 重新分配达到size大小,类似stl中的resize
*/
int dynamic_realloc(int size)
{
if(size > MAX_ARRAY_NUM * ARRAY_SIZE)
return -1;
int cnt = 0;
while(iSize <= size)
{
int major_idx = (iSize - 1) / ARRAY_SIZE;
pArray[major_idx] = (DYN_ARRAY<int> *)calloc(1, sizeof(DYN_ARRAY<int>));
++ cnt;
if(pArray[major_idx] == NULL)
return -1;
iSize += ARRAY_SIZE;
}
printf("alloc %d memory\n", cnt * sizeof(DYN_ARRAY<int>));
return 0;
}
#endif