南哪2022-8-pointer EX 动态数组
题单介绍
下午上C语言课真的好困……
某CQ:每天debug到很晚,舍友说我头上貌似秃了一块了(
这次我们介绍一个很方便但是在C语言当中依然用起来有些难度的东西——动态数组。
行向量vector,在C++STL当中有它,但我们更习惯称它位动态数组,它的特点就是能够动态分配数组的内存,方便我们应对未知数据量的问题。
这么好用?不,它虽然优化了空间,但它也用掉了一部分的时间用来维护这个动态数组。不过总体上来说,这个动态数组还是很推荐学一学,用一用的。
(有些人特别钟爱用vector存图,常数大的起飞,我不说是谁(︶^︶))
接下来就大概的看一看实现的代码,相信加上注释和清晰的变量命名,你们应该能看懂。
这次依旧没有经过检查,所以直接抄代码请你谨慎。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Vector//建立一个行向量结构体,里面存三个指针
{
int* start;//指向数组开头
int* finish;//指向数组结尾
int* endOfStorage;//指向内存结尾
}vec;
void initialize()//初始化动态数组
{
vec.start = vec.finish = vec.endOfStorage = NULL;
}
void destroy()//删除这个动态数组,释放内存
{
free(vec.start);
}
int* begin()//返回指向数组开头的指针
{
return vec.start;
}
int* end()//返回指向数组结尾的指针
{
return vec.finish;
}
int size()//返回当前数组大小
{
return vec.finish - vec.start;
}
int capacity()//返回当前数组容量
{
return vec.endOfStorage - vec.start;
}
//特别提醒,为了节约时间成本
//每次扩容时会把容量多扩一些
//因为每次扩容都需要重新申请一段内存,然后把原来的移过来
//所以这里的容量和数组大小并不相同
void reserve(int n)//将容量扩充至n,如果当前容量不够需要重新申请内存
{
if (n > capacity())
{
int* tmp = malloc(n * sizeof(int));
int sz = size();
if (vec.start)
{
for (int i = 0; i < sz; ++i)
tmp[i] = vec.start[i];
free(vec.start);
}
vec.start = tmp;
vec.finish = vec.start + sz;
vec.endOfStorage = vec.start + n;
}
}
void resize(int n, int val)//改变数组长度至n,其中未定义的数组元素会被赋值成val
{
if (n > capacity())
reserve(n);
for (int i = size(); i < n; ++i)
vec.start[i] = val;
vec.finish = vec.start + n;
}
void push_back(int val)//在数组尾部添加一个元素,值为val
{
if (size() == capacity())
{
int newcapacity = size() == 0 ? sizeof(int) : capacity() * 2;
reserve(newcapacity);
}
*vec.finish = val;
++vec.finish;
}
void pop_back()//在数组尾部删除一个元素
{
if (size() > 0)
--vec.finish;
}
void insert(int pos, int val)//在数组的第pos位插入一个元素,值为val
{
if (vec.finish == vec.endOfStorage)
reserve(size() + 1);
for (int i = size(); i > pos; --i)
*(vec.start + i) = *(vec.start + i - 1);
*(vec.start + pos) = val;
++vec.finish;
}
void erase(int pos)//删除数组的第pos位元素
{
for (int i = size(); i > pos; --i)
*(vec.start + i - 1) = *(vec.start + i);
--vec.finish;
}
int get(int pos)//获取数组的第pos位元素
{
return *(vec.start + pos);
}
int main(int argc, char *argv[])
{
initialize();
int x;
scanf("%d", &x);
push_back(x);
push_back(x);
pop_back();
insert(0, 1);
erase(0);
destroy();
return 0;
}
```