南哪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; } ```

题目列表