📜  C中的ector()函数(1)

📅  最后修改于: 2023-12-03 15:14:24.944000             🧑  作者: Mango

C中的vector()函数

简述

在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

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

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

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. 需要手动管理内存,使用后需要调用free()函数释放内存。
  2. 因为vector()函数是自己实现的,可能存在一些潜在的问题。如果需要在多线程环境下使用vector,需要加锁保证线程安全性。
  3. 可以自己实现一些常用的操作函数,如size、push_back、pop_back等。
  4. 在使用realloc()函数时需要注意原指针的地址可能已经被改变,需要将新的指针地址赋值给原指针变量。
参考资料

【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/