动态数组的设计

来源:互联网 发布:姜峰手机 淘宝 编辑:程序博客网 时间:2024/06/16 00:40

array_vector.h

#ifndef _ARRAY_VECTOR_#define _ARRAY_VECTOR_   //防止重复包含/*C/C++里面内存到底可以分配在那些位置?1:参数 局部变量     分配在栈上2:静态变量 全局变量 分配在数据段上3:使用malloc free new delete在运行期间像操作系统申请的内存,然后不用了,又释放内存,为堆上的内存int a[常量大小]://缺点1:只能分配在栈上,或定义为全局变量2:一旦定义后,数据的元素个数再也无法改变//优点按索引来存放数据,方便使用和查找 (索引从0开始)动态数组:1:具备数组的访问优点,可以通过索引来获取里面的值2:可以扩充数组的容量,当需要存放的数据元素超过容量的时候,可以扩容3:动态数组的内存 分配在堆上*/struct array_vector{unsigned char* mem_ptr; //指向我们的堆上动态数组的内存int max_elem;//保存我们当前这块内存能存放的最大元素个数int elem_count;//当前动态数据里面保存的元素的个数int sizeof_elem;//每一个元素所占的内存大小};//初始化我们的结构体,指定让他来存储哪种数据类型void vector_define(struct array_vector* v, int sizeof_elem);void vector_clear(struct array_vector* v);    //清除动态数组所占用的资源//将我们的元素的数据,放到我们的动态数组的后面void vector_push_back(struct array_vector* v, void* elem_ptr, int sizeof_elem);void vector_push_at(struct array_vector* v, int index);//数组存放的元素个数int vector_size(struct array_vector* v);void* vector_index(struct array_vector* v, int index);void* vector_begin(struct array_vector* v);//弹出元素void vector_pop_back(struct array_vector* v);void vector_pop_all(struct array_vector* v);  //弹出所有元素,但是不释放内存,释放内存在clear里面void vector_eraise(struct array_vector* v,int index);#endif

array_vector.cpp

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <assert.h>#include "array_vector.h"#define my_malloc malloc#define my_free free#define my_realloc reallocvoid vector_define(array_vector * v, int sizeof_elem){memset(v, 0, sizeof(struct array_vector));v->sizeof_elem = sizeof_elem;}void vector_clear(array_vector * v){if (v->mem_ptr != NULL){my_free(v->mem_ptr);memset(v, 0, sizeof(struct array_vector));}}#define EXTEND_STEP 16void vector_push_back(struct array_vector* v, void* elem_ptr, int sizeof_elem){if (elem_ptr == NULL || sizeof_elem != v->sizeof_elem){return;}if (v->max_elem <= v->elem_count){v->max_elem += EXTEND_STEP; //扩容v->mem_ptr = (unsigned char*)my_realloc(v->mem_ptr, v->max_elem * v->sizeof_elem);}unsigned char* dst = v->mem_ptr + v->sizeof_elem * v->elem_count;memcpy(dst, elem_ptr, v->sizeof_elem);v->elem_count++;  //多存放了一个数据}int vector_size(struct array_vector* v){return v->elem_count;}void* vector_index(struct array_vector* v, int index){assert(index >= 0 && index < v->elem_count); //确保index合法性return (void*)(v->mem_ptr + index * v->sizeof_elem);}void* vector_begin(struct array_vector* v){return (void*)v->mem_ptr;}void vector_pop_all(struct array_vector* v){v->elem_count = 0;}


main.cpp

#include<stdio.h>#include<string.h>#include<stdlib.h>#include "array_vector.h"int main(int argc, char **argv){struct array_vector vec_int;  //用来存放int类型的数据vector_define(&vec_int, sizeof(int));int a = 4;vector_push_back(&vec_int, &a, sizeof(int));a = 5;vector_push_back(&vec_int, &a, sizeof(int));a = 6;vector_push_back(&vec_int, &a, sizeof(int));a = 7;vector_push_back(&vec_int, &a, sizeof(int));int* array_name = (int*)vector_begin(&vec_int);for (int i = 0; i < vector_size(&vec_int); i++){int* emem_ptr = (int*)vector_index(&vec_int, i);printf("%d, %d, %d\n", emem_ptr[0], *emem_ptr , array_name[i]);}vector_clear(&vec_int);system("pause");return 0;}