可变长只是一种假象,其原理是,当空间不足时,分配新空间,将原空间中的数据转移过去,然后释放旧空间,C++中的vector也是这样的原理,所以,重复的改变空间开销是特别大的,要分配空间,还要转移数据,因此最好一开始就确定好空间,使用vector也尽量不要使用push_back()
#include <stdio.h>
#include <malloc.h>
#define elem int
struct Array {
elem* value;
int _size;
int _capacity;
};
Array* getNewArray(int capacity = 0) { //根据容量获得新数组
Array* a = (Array*)malloc(sizeof(Array));
a->_size = 0;
a->_capacity = capacity;
a->value = (elem*)malloc(sizeof(elem) * capacity);
return a;
}
bool reCapacity(Array* a, int capacity) { //重新分配空间
if (a == NULL)
return false;
elem* p = (elem*)malloc(sizeof(elem) * capacity); //新空间
if (capacity < a->_size) //取小的size
a->_size = capacity;
a->_capacity = capacity; //修改容量
for (int i = 0; i < a->_size; i++) //将旧空间的值转移到新空间
p[i] = a->value[i];
free(a->value); //释放旧的空间
a->value = p; //将指针指向新空间
return true;
}
void append(Array* a, elem e) {
if (a->_size >= a->_capacity) //当size大于容量capacity时,分配原来2倍的大小新空间
reCapacity(a, a->_capacity << 1);
a->value[a->_size++] = e;
}
int main() {
Array* c = getNewArray(2); //创建容量为2的新数组
for (int i = 1; i <= 50; i++) //插入50个值
append(c, i);
for (int i = 0; i < c->_size; i++)
printf("%d\n", c->value[i]);
printf("capacity:%d", c->_capacity);
return 0;
}