动态数组的设计
来源:互联网 发布:姜峰手机 淘宝 编辑:程序博客网 时间: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;}
#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;}
阅读全文
0 0
- 动态数组的设计
- 动态数组的复制
- 动态数组的传递
- 动态数组的定义
- 动态数组的应用
- 动态数组的应用
- 动态数组的实现
- 动态数组的应用
- 动态数组的实现
- 动态数组的使用
- 动态数组的构建
- 动态数组的使用
- 动态数组的使用
- 动态数组的实现
- 动态数组的创建
- 数组的动态初始化
- C 语言设计模式(一) 动态数组
- 动态工作流的设计
- struct和typedef struct
- 设计模式之中介者模式
- BZOJ3890 [Usaco2015 Jan]Meeting Time K短路 Astar || 拓扑DP
- arpa2fst 原理详解
- 第三方开源库 EventBus
- 动态数组的设计
- EOJ Monthly 2017.12
- iOS SDK开发经验分享
- 特征工程(feature engineering)
- CAP原则、BASE理论
- 游戏服务器框架简述
- 第三方开源库 OKHttp
- 中心极限定理与大数定理理解
- java占位符应用实例