📅  最后修改于: 2023-12-03 15:14:24.944000             🧑  作者: Mango
在C++中,我们通常使用STL标准库提供的vector容器来存储动态数组,而在C语言中并没有直接支持动态数组的类型。但是,有一些C库提供了vector()函数来模拟动态数组的实现。
vector()函数在标准C库中并不存在,我们需要包含stdlib.h头文件,然后使用malloc()函数手动分配内存,再使用realloc()函数在必要时重新分配内存,来达到与C++中vector相似的效果。
vector()函数使用时需要指定元素的类型和初始容量。其使用方式类似于C++中vector的构造函数。下面是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#define initial_capacity 4
// 定义元素类型
typedef struct {
int value;
} my_type;
// 声明vector函数
my_type* vector(int element_size, int initial_capacity);
int main() {
// 调用vector函数分配内存
my_type* vec = vector(sizeof(my_type), initial_capacity);
// 向vector中添加元素
for (int i = 0; i < initial_capacity; i++) {
my_type element = {i};
vec[i] = element;
}
// 输出vector中的元素
for (int i = 0; i < initial_capacity; i++) {
printf("%d\n", vec[i].value);
}
// 释放vector占用的内存
free(vec);
return 0;
}
// 定义vector函数
my_type* vector(int element_size, int initial_capacity) {
my_type* vec;
vec = (my_type*)malloc(element_size * initial_capacity);
if (vec == NULL) {
return NULL;
}
return vec;
}
由于C语言中没有提供动态数组类型,vector()函数本身并没有提供过多的操作函数。一般情况下,我们需要自己实现一些常用的操作函数。下面是一些常见的操作函数和其实现方式:
size函数用于获取vector中元素的数量。我们可以定义一个全局变量size来记录当前vector中的元素数量。
#include <stdio.h>
#include <stdlib.h>
#define initial_capacity 4
// 定义元素类型
typedef struct {
int value;
} my_type;
// 声明vector函数
my_type* vector(int element_size, int initial_capacity);
// 声明size函数
int size();
// 声明push_back函数
int push_back(my_type* vec, my_type element);
// 定义全局变量
int num_elements = 0;
int main() {
// 调用vector函数分配内存
my_type* vec = vector(sizeof(my_type), initial_capacity);
// 向vector中添加元素
for (int i = 0; i < initial_capacity; i++) {
my_type element = {i};
push_back(vec, element);
}
// 输出vector中的元素
for (int i = 0; i < size(); i++) {
printf("%d\n", vec[i].value);
}
// 释放vector占用的内存
free(vec);
return 0;
}
// 定义vector函数
my_type* vector(int element_size, int initial_capacity) {
my_type* vec;
vec = (my_type*)malloc(element_size * initial_capacity);
if (vec == NULL) {
return NULL;
}
return vec;
}
// 定义size函数
int size() {
return num_elements;
}
// 定义push_back函数
int push_back(my_type* vec, my_type element) {
if (num_elements == initial_capacity) {
return -1;
}
vec[num_elements] = element;
num_elements++;
return 0;
}
push_back函数用于向vector中添加元素。我们可以定义一个全局变量num_elements来记录当前vector中的元素数量,并通过realloc()函数动态扩展数组。
#include <stdio.h>
#include <stdlib.h>
#define initial_capacity 4
// 定义元素类型
typedef struct {
int value;
} my_type;
// 声明vector函数
my_type* vector(int element_size, int initial_capacity);
// 声明size函数
int size();
// 声明push_back函数
int push_back(my_type* vec, my_type element);
// 定义全局变量
int num_elements = 0;
int main() {
// 调用vector函数分配内存
my_type* vec = vector(sizeof(my_type), initial_capacity);
// 向vector中添加元素
for (int i = 0; i < initial_capacity; i++) {
my_type element = {i};
push_back(vec, element);
}
// 输出vector中的元素
for (int i = 0; i < size(); i++) {
printf("%d\n", vec[i].value);
}
// 释放vector占用的内存
free(vec);
return 0;
}
// 定义vector函数
my_type* vector(int element_size, int initial_capacity) {
my_type* vec;
vec = (my_type*)malloc(element_size * initial_capacity);
if (vec == NULL) {
return NULL;
}
return vec;
}
// 定义size函数
int size() {
return num_elements;
}
// 定义push_back函数
int push_back(my_type* vec, my_type element) {
if (num_elements == initial_capacity) {
// 动态扩展数组
my_type* new_vec;
initial_capacity = initial_capacity * 2;
new_vec = (my_type*)realloc(vec, initial_capacity * sizeof(my_type));
if (new_vec == NULL) {
return -1;
}
vec = new_vec;
}
vec[num_elements] = element;
num_elements++;
return 0;
}
pop_back函数用于删除vector中的最后一个元素。我们可以直接将全局变量num_elements减1。
#include <stdio.h>
#include <stdlib.h>
#define initial_capacity 4
// 定义元素类型
typedef struct {
int value;
} my_type;
// 声明vector函数
my_type* vector(int element_size, int initial_capacity);
// 声明size函数
int size();
// 声明push_back函数
int push_back(my_type* vec, my_type element);
// 声明pop_back函数
void pop_back();
// 定义全局变量
int num_elements = 0;
int main() {
// 调用vector函数分配内存
my_type* vec = vector(sizeof(my_type), initial_capacity);
// 向vector中添加元素
for (int i = 0; i < initial_capacity; i++) {
my_type element = {i};
push_back(vec, element);
}
// 输出vector中的元素
for (int i = 0; i < size(); i++) {
printf("%d\n", vec[i].value);
}
// 删除vector中的最后一个元素
pop_back();
// 输出vector中的元素
for (int i = 0; i < size(); i++) {
printf("%d\n", vec[i].value);
}
// 释放vector占用的内存
free(vec);
return 0;
}
// 定义vector函数
my_type* vector(int element_size, int initial_capacity) {
my_type* vec;
vec = (my_type*)malloc(element_size * initial_capacity);
if (vec == NULL) {
return NULL;
}
return vec;
}
// 定义size函数
int size() {
return num_elements;
}
// 定义push_back函数
int push_back(my_type* vec, my_type element) {
if (num_elements == initial_capacity) {
// 动态扩展数组
my_type* new_vec;
initial_capacity = initial_capacity * 2;
new_vec = (my_type*)realloc(vec, initial_capacity * sizeof(my_type));
if (new_vec == NULL) {
return -1;
}
vec = new_vec;
}
vec[num_elements] = element;
num_elements++;
return 0;
}
// 定义pop_back函数
void pop_back() {
if (num_elements > 0) {
num_elements--;
}
}
使用vector()函数时需要注意以下几点:
【1】C Vector and How to Implement dynamic arrays in C?, https://www.mygreatlearning.com/blog/c-vector-and-how-to-implement-dynamic-arrays-in-c/