1. Vector的意义与定义
Vector表示可变长度的对象指针数组向量,定义如下,
typedef struct vector
{
void **data;
int len;
int size;
} *Vector;
data, 表示对象指针数组的首地址.
len, 表示数组中指针的数量.
size, 表示数组的最大容量.
2. Vector的操作
Vector定义了一系列的操作,获取数组项的数目,插入新的项,获取指定的项,遍历数组项.
2.1 获取Vector的长度
#define LEN(v) (v->len)
2.2 插入新的项
#define INSERT_ITEM(v, item) \
do { \
if (v->len >= v->size) \
ExpandVector(v); \
v->data[v->len] = item; \
v->len++; \
} while (0)
首先检查数组是否已满,如果没有空闲空间,需要先扩展Vector空间。
将新的项置于数组向量末尾,最后将长度加一。
2.3 根据索引获取向量元素
#define GET_ITEM(v, i) (v->data[i])
2.4 向量的遍历
#define FOR_EACH_ITEM(ty, item, v) \
{ \
int len = v->len; \
int i = 0; \
for (i = 0; i < len; i++) \
{ \
item = (ty)v->data[i];
#define ENDFOR \
} \
}
定义foreach语义,使用宏实现的方式.
3. Vector的初始化与扩容
3.1 Vector的初始化
Vector从当前的Heap中,分配struct vector结构和内部向量数组,并将长度初始化为0.
3.2 Vector的扩容
void ExpandVector(Vector v)
{
void *orig;
orig = v->data;
v->data = HeapAllocate(CurrentHeap, v->size * 2 * sizeof(void *));
memcpy(v->data, orig, v->size * sizeof(void *));
v->size *= 2;
}
将向量扩容,首先从当前的Heap中分配两倍于原来数组容量的新数组,将老数组的项复制到新数组,并将容量翻倍。
注意,数组扩容没有将老的内部数组内存释放。