起因
已经很少接触纯C语言项目,不过本着大道至简的念头,空暇时间可以写着玩玩,雕琢技艺,
目标
纯C实现动态数组,提供方便易用泛型接口,避免依赖
实现一
vector.h
#ifndef VECTOR_H #define VECTOR_H #include <stddef.h> struct Vector_; typedef struct Vector_ Vector; Vector* vector_new(size_t elem_size); void vector_destory(Vector* v); size_t vector_length(Vector* v); void vector_append(Vector* v, void* elem_in); void vector_get(Vector* v, size_t pos, void* elem_out); void vector_set(Vector* v, size_t pos, void* elem_in); #endif // VECTOR_H
vector.c
#include <stdlib.h> #include <string.h> #include "vector.h" #define DEFAULT_VECTOR_SIZE 10 typedef unsigned char byte; typedef struct Vector_ { size_t size; size_t max_size; size_t elem_size; void* data; } Vector; static void vector_realloc(Vector* v) { v->data = realloc(v->data, v->elem_size*v->max_size); } static void vector_init(Vector* v, size_t elem_size) { v->size = 0; v->max_size = DEFAULT_VECTOR_SIZE; v->elem_size = elem_size; v->data = NULL; vector_realloc(v); } Vector* vector_new(size_t elem_size) { Vector* v = realloc(0, sizeof(Vector)); vector_init(v, elem_size); return v; } void vector_destory(Vector* v) { free(v->data); free(v); } size_t vector_length(Vector* v) { return v->size; } void vector_append(Vector* v, void* elem_in) { byte* p = v->data; if (v->size >= v->max_size) { v->max_size *= 2; vector_realloc(v); } p += v->elem_size * v->size; memcpy(p, elem_in, v->elem_size); v->size ++; } void vector_get(Vector* v, size_t pos, void* elem_out) { byte* p = v->data; if (pos < v->size) { p += v->elem_size * pos; memcpy(elem_out, p, v->elem_size); } } void vector_set(Vector* v, size_t pos, void* elem_in) { byte* p = v->data; if (pos < v->size) { p += v->elem_size * pos; memcpy(p, elem_in, v->elem_size); } }
测试
#include <stdio.h> #include <stdlib.h> #include "vector.h" int main(int argc, char *argv[]) { int test_data[] = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9}; size_t test_data_len = sizeof(test_data) / sizeof(int); Vector* v = vector_new(sizeof(int)); int i, x; for (i=0; i<test_data_len; i++) { vector_append(v, &test_data[i]); } printf("len:%d \n", vector_length(v)); for (i=0; i<test_data_len; i++) { vector_get(v, i, &x); printf("%d => %d \t", i, x); x *= 10; vector_set(v, i, &x); vector_get(v, i, &x); printf("%d => %d \n", i, x); } vector_destory(v); return 0; }