c/c++动态数组
来源:互联网 发布:手机淘宝开店教程视频 编辑:程序博客网 时间:2024/05/22 04:43
接口文件
#ifndef __VERCTOR_ARRAY_H__
#define __VERCTOR_ARRAY_H__
//动态数组的对象结构
struct vector_array{
unsigned char* mem_data;//存放数组元素的内存地址,内存是分配在堆上的
int max_elem; // 当前内存最大容量
int elem_count; // 当前内存存放的元素个数
int sizeof_elem; //每个元素所占的内存大小
};
//end
//定义配置这个动态数组存放了那种类型的元素
void verctor_define(struct vector_array* v, int sizeof_elem);
// 清楚掉我们动态数组在堆上为元素分配的内存,动态数组将不会存放任何数据;
void vector_clear(struct vector_array* v);
//往动态数组最后存放元素
void vector_push_back(struct vector_array* v, const void* elem_ptr);
//获取第i个元素的内存地址
void* vector_at(struct vector_array* v, int i);
//获取数组存放的内存的首地址
void* vector_begin(struct vector_array* v);
//删除数组里面的元素,从start开始删除count个
void vector_erase(struct vector_array* v, int start, int count);
//获取数组当前元素个数
#define vector_size(v) ((v)->elem_count)
//清除数组里面的所有元素,内存还是继续使用
void vector_popall(struct vector_array* v);
//弹出数组最后一个元素,并把最后一个元素的值写到输出内存地址中
void vector_popback(struct vector_array* v, void* out_of_elem);
//弹出动态数组的第一个元素;
void vector_popfront(struct vector_array* v, void* out_of_elem);
#endif
c文件源码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "vector_array.h"
#define my_malloc malloc
#define my_free free
#define my_realloc realloc
#define ELEM_STEP 64
void verctor_define(struct vector_array* v, int sizeof_elem){
memset(v, 0, sizeof(struct vector_array));
v->sizeof_elem = sizeof_elem;
}
void vector_clear(struct vector_array* v){
if (v->mem_data){
my_free(v->mem_data);
v->mem_data = NULL;
}
v->elem_count = 0;
v->max_elem = 0;
}
void vector_push_back(struct vector_array* v, const void* elem_ptr){
//判断当前内存地址的数据是否已满
if (v->elem_count >= v->max_elem){
v->max_elem += ELEM_STEP;
v->mem_data = my_realloc(v->mem_data, v->max_elem * v->sizeof_elem);
}
//存放元素,存放位置为当前内存地址+ 现在元素个数 * 元素大小
memcpy(v->mem_data + v->elem_count * v->sizeof_elem, elem_ptr, v->sizeof_elem);
v->elem_count++;
}
void* vector_at(struct vector_array* v, int i){
if (i < 0 || i >= v->elem_count){
return NULL;
}
return (void*)(v->mem_data + i * v->sizeof_elem);
}
void* vector_begin(struct vector_array* v){
return v->mem_data;
}
void vector_erase(struct vector_array* v, int start, int count){
//判断删除个数索引的合法性
if (start < 0 || start >= v->elem_count){
return;
}
if (start + count >v->elem_count){
count -= ((start + count) - v->elem_count); //如果删除个数大于数组元素个数 ,就把多余的部分减掉,相当于删除start后面所有的元素
}
if ((v->elem_count - (start + count) > 0)){
memmove(v->mem_data + start * v->sizeof_elem, //目标地址
v->mem_data + (start + count) * v->sizeof_elem, //原地址
(v->elem_count - (start + count)) * v->sizeof_elem); //移动字节数
}
v->elem_count -= count;
}
void vector_popall(struct vector_array* v){
v->elem_count = 0; //把元素个数设置为0 当下次存储新元素的时候,就会覆盖,就相当于清除了内存地址
}
void vector_popback(struct vector_array* v, void* out_of_elem){
if (v->elem_count <= 0){
return;
}
v->elem_count--;
if (out_of_elem){
memcpy(out_of_elem, v->mem_data + v->elem_count * v->sizeof_elem, v->sizeof_elem); //因为减掉了1个元素,所以原地址为count*size
}
}
void vector_popfront(struct vector_array* v, void* out_of_elem){
if (v->elem_count <= 0){
return;
}
v->elem_count--;
if (out_of_elem){
memcpy(out_of_elem, v->mem_data, v->sizeof_elem); //因为之前没有减掉1个数量,所以源地址为(count - 1) * size
}
if (v->elem_count > 0){
memmove(v->mem_data, v->mem_data + v->sizeof_elem, v->elem_count * v->sizeof_elem); //把数据移动到第一个地址位置,相当于把第一个元素删除掉了
}
}
使用main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "./vector_array.h"
int main(int argc, char** argv){
int b = 4;
struct vector_array array;
verctor_define(&array, sizeof(int));
vector_push_back(&array, &b);
b = 8;
vector_push_back(&array, &b);
b = 16;
vector_push_back(&array, &b);
int *ptr = NULL;
ptr = vector_at(&array, 2);
printf("第2个元素 = %d\n", *ptr);
int last;
int first;
vector_popfront(&array, &first);
vector_popback(&array, &last);
printf("first = %d\n", first);
printf("last = %d\n", last);
//遍历数组
printf("*********遍历数组********\n");
ptr = vector_begin(&array);
for (int i = 0; i < vector_size(&array); i++){
printf("%d\n", ptr[i]);
}
printf("*************************\n");
vector_clear(&array);
system("pause");
return 0;
}
- C语言动态数组
- c语言 动态数组
- C语言动态数组
- C语言动态数组
- C语言动态数组
- 动态数组(c++)
- c 动态数组
- C定义动态数组
- C语言动态数组
- C语言动态数组
- c语言动态数组
- C实现动态数组
- C语言动态数组
- 动态二维数组(C++)
- C++:关于动态数组
- c/c++动态数组
- C语言建立动态数组
- [原创]c语言动态数组
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- 【ROS总结】点激光扫描仪数据发布(驱动编写)
- Learning Storm.pdf 英文原版 免费下载
- Linux基础-crontab计划任务
- 博主更换了一个新的CSDN 账号
- c/c++动态数组
- 解决:connect Network is unreachable 和 ping unknown host www.baidu.com
- 大数进制转换
- 理解dropout
- Linux文件预习
- windows(win10)下的mysql解压版安装
- Scalable Big Data Architecture.pdf 英文原版 免费下载
- 纯搭建Hibernate web项目框架
- Python学习笔记--基础篇2