「Linux C语言教程」 如何实现C标准库中的vector容器 (linux c实现vector)
Linux C语言教程:如何实现C标准库中的vector容器
在C++中,vector是一种非常常用的动态数组容器,但在C语言中并没有类似的容器。本篇文章将介绍如何在C语言中实现一个类似vector的动态数组容器,以便更方便地管理动态数组。
实现过程
1. 定义结构体
我们首先需要定义一个结构体来表示容器,其中包含三个成员变量:指向数组的指针,容器中已经存储的元素个数以及数组的容量大小。
“`c
typedef struct vector {
void** array;
size_t size;
size_t capacity;
} vector;
“`
2. 初始化容器
在创建一个新的容器时,需要先为数组分配一定的空间。为避免过多的内存分配及释放操作,我们可以一开始就为数组分配一个默认的容量大小,在数组满时再进行扩容。在这里,我们将默认容量大小设置为10个元素。在实现时,我们需要调用calloc函数来分配内存,以便初始化所有元素为NULL。
“`c
vector* new_vector() {
vector* v = malloc(sizeof(vector));
v->array = calloc(10, sizeof(void*));
v->size = 0;
v->capacity = 10;
return v;
}
“`
3. 添加元素
在向容器中添加元素时,我们需要先判断当前容器中是否还有足够的空间。如果没有,则需要对数组进行扩容。在这里,我们将数组的容量扩大为原来的两倍。在实现中,我们调用realloc函数来对数组进行扩容操作。
“`c
void vector_push_back(vector* v, void* element) {
if(v->size == v->capacity) {
v->capacity *= 2;
v->array = realloc(v->array, v->capacity * sizeof(void*));
}
v->array[v->size++] = element;
}
“`
4. 获取元素
获取容器中的元素可以通过下标来实现。需要注意的是,我们需要对下标进行合法性检查,确保下标在[0,size)的范围内。在这里,我们直接返回数组下标对应的元素。
“`c
void* vector_at(vector* v, size_t index) {
if(index = v->size) {
return NULL;
}
return v->array[index];
}
“`
5. 销毁容器
在不再需要使用容器时,需要对容器进行销毁。在销毁之前,我们需要先释放数组的内存,然后释放容器的内存。
“`c
void vector_destroy(vector* v) {
free(v->array);
free(v);
}
“`
完整代码展示
“`c
#include
#include
typedef struct vector {
void** array;
size_t size;
size_t capacity;
} vector;
vector* new_vector() {
vector* v = malloc(sizeof(vector));
v->array = calloc(10, sizeof(void*));
v->size = 0;
v->capacity = 10;
return v;
}
void vector_push_back(vector* v, void* element) {
if(v->size == v->capacity) {
v->capacity *= 2;
v->array = realloc(v->array, v->capacity * sizeof(void*));
}
v->array[v->size++] = element;
}
void* vector_at(vector* v, size_t index) {
if(index = v->size) {
return NULL;
}
return v->array[index];
}
void vector_destroy(vector* v) {
free(v->array);
free(v);
}
int mn() {
vector* v = new_vector();
int a = 1;
int b = 2;
int c = 3;
vector_push_back(v, &a);
vector_push_back(v, &b);
vector_push_back(v, &c);
printf(“%d\n”, *((int*)vector_at(v, 0)));
printf(“%d\n”, *((int*)vector_at(v, 1)));
printf(“%d\n”, *((int*)vector_at(v, 2)));
vector_destroy(v);
return 0;
}
“`