在C语言环境下,编写自己的Vector容器。
由 王宇 原创并发布 :
最近工作中,需要用标准C去实现一些统计数据的功能。开发过程中没有容器非常不方便,所以自己尝试着编写了一个简单的Vector容器。
一、功能说明:
通过一个例子来说明如何使用这个Vector:
#include "containers.h" #include <stdio.h> // 测试用的结构体 typedef struct tagTextStruct { int key; char* value; }TestStruct; // 失败提示函数 static void ABORT( char *file,int line) { fprintf(stderr ,"*****\n\nABORT\nFile %s Line %d\n**********\n\n",file,line); abort(); } #define Abort () ABORT(__FILE__,__LINE__) // 摧毁资源 static int destructorFunc( void *v) { // 获得Vector中的一个元素 TestStruct* ts = (TestStruct*)v; if(ts->value != NULL ) { int l = strlen (ts->value); // 释放内存 free(ts->value); ts->value = NULL; } return 0; } // 遍历并打印Vector中的元素 static void PrintVector(Vector *AL) { size_t i; TestStruct* ts; // 打印Vector中已有元素,和总容量 printf("Count %ld, Capacity %ld\n",(long)iVector. Size(AL),(long )iVector.GetCapacity(AL)); // 遍历Vector for (i=0; i<iVector.Size (AL);i++) { // 获得Vector中的元素 ts = (TestStruct*)iVector. GetElement(AL, i); printf("%d\n" ,ts->key); printf("%s\n" ,ts->value); } printf("\n" ); } // 测试Vector static int testVector(Vector** AL) { int errors=0; char* s1 = "ts1 value." ; char* s2 = "ts2 value" ; char* temp1 = NULL ; char* temp2 = NULL ; TestStruct ts1, ts2; *AL = iVector. Create(sizeof (TestStruct),5); // 配置摧毁资源的回调函数,这里的destructorFunc是一个指针函数。 iVector. SetDestructor(*AL, destructorFunc ); // 初始化元素,并分配堆空间 ts1.key = 1; temp1 = ( char*)malloc (strlen(s1) + 1); if(temp1 == NULL) { Abort(); } strcpy(temp1, s1); ts1.value = temp1; ts2.key = 2; temp2 = ( char*)malloc (strlen(s2) + 1); if(temp2 == NULL) { Abort(); } strcpy(temp2, s2); ts2.value = temp2; // 将元素加入到Vecotor中 iVector. Add(*AL,&ts1); iVector. Add(*AL,&ts2); // 删除一个Vector iVector. Erase(*AL, &ts1); // 获得容器中的实际大小 if (1 != iVector.Size (*AL)) Abort(); return errors; } // 主程序入口 int main (void) { int errors=0; Vector* AL = NULL; // 测试Vector errors += testVector (&AL); // 释放Vector iVector.Finalize(*AL); return errors; }
二、Vector的结构:
声明Vector类型: