C++ vector源码
时间: 2023-06-10 09:08:49 浏览: 174
以下是一个简单的 C 语言动态数组实现,类似于 C++ 的 std::vector:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *arr; // 存储数据的指针
int size; // 当前容量
int count; // 当前元素个数
} Vector;
// 初始化动态数组
void initVector(Vector *v) {
v->arr = (int *)malloc(sizeof(int) * 10);
v->size = 10;
v->count = 0;
}
// 添加元素
void pushBack(Vector *v, int val) {
if (v->count == v->size) {
v->size *= 2;
v->arr = (int *)realloc(v->arr, sizeof(int) * v->size);
}
v->arr[v->count++] = val;
}
// 删除元素
void popBack(Vector *v) {
if (v->count > 0) {
v->count--;
}
}
// 获取元素个数
int size(Vector *v) {
return v->count;
}
// 获取指定下标的元素
int at(Vector *v, int index) {
if (index >= 0 && index < v->count) {
return v->arr[index];
}
return -1;
}
// 释放动态数组内存
void freeVector(Vector *v) {
free(v->arr);
v->arr = NULL;
v->size = 0;
v->count = 0;
}
int main() {
Vector v;
initVector(&v);
pushBack(&v, 1);
pushBack(&v, 2);
pushBack(&v, 3);
pushBack(&v, 4);
pushBack(&v, 5);
printf("size: %d\n", size(&v));
printf("at(0): %d\n", at(&v, 0));
printf("at(2): %d\n", at(&v, 2));
popBack(&v);
popBack(&v);
printf("size: %d\n", size(&v));
printf("at(2): %d\n", at(&v, 2));
freeVector(&v);
return 0;
}
```
这个动态数组的实现在初始化时会分配一块大小为 10 的内存,当添加元素时,如果当前元素个数已经等于容量大小,则将容量大小扩大一倍,并重新分配内存。删除元素时只需将元素个数减一即可。
这只是一个简单的实现,实际上还有许多细节需要考虑,例如内存分配失败的情况、插入元素时需要移动后续元素的问题等等。
阅读全文