c++动态数组vector是怎样重新申请内存的,请用c实现类似vector的功能
时间: 2023-08-12 15:36:15 浏览: 113
在C++中,vector动态申请内存的过程是通过调用new操作符实现的。当vector中元素数量超过当前内存空间大小时,会重新申请更大的内存空间,并将原有元素复制到新的内存空间中。
下面是一个用C实现类似vector的简单示例代码,实现了动态增加元素、获取元素数量、获取指定位置的元素等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int *data; // 存储元素的内存空间
int size; // 当前元素数量
int capacity; // 当前内存空间大小
} Vector;
void vector_init(Vector *vec) {
vec->data = NULL;
vec->size = 0;
vec->capacity = 0;
}
void vector_push_back(Vector *vec, int value) {
// 如果当前元素数量已经等于内存空间大小,需要重新申请更大的内存空间
if (vec->size == vec->capacity) {
int new_capacity = vec->capacity ? vec->capacity * 2 : 1;
int *new_data = (int*)realloc(vec->data, new_capacity * sizeof(int));
if (!new_data) {
printf("error: out of memory\n");
exit(1);
}
vec->data = new_data;
vec->capacity = new_capacity;
}
// 在数组末尾添加新元素
vec->data[vec->size++] = value;
}
int vector_size(const Vector *vec) {
return vec->size;
}
int vector_at(const Vector *vec, int index) {
if (index < 0 || index >= vec->size) {
printf("error: index out of range\n");
exit(1);
}
return vec->data[index];
}
int main() {
Vector vec;
vector_init(&vec);
for (int i = 0; i < 10; i++) {
vector_push_back(&vec, i);
}
for (int i = 0; i < vector_size(&vec); i++) {
printf("%d ", vector_at(&vec, i));
}
printf("\n");
return 0;
}
```
在上面的示例代码中,我们使用realloc函数来重新申请更大的内存空间。如果申请失败,则会打印错误信息并退出程序。vector_push_back函数用于向数组末尾添加新元素,如果当前元素数量已经等于内存空间大小,则会调用realloc函数申请更大的内存空间。vector_size函数用于获取当前元素数量,vector_at函数用于获取指定位置的元素。
阅读全文