【C语言中的vector】高效动态数组揭秘与实战指南

日期:

最佳答案

引言

在C言语中,固然数组是一种常用的数据构造,但它们的大小在定义时就曾经牢固,无法在运转时静态调剂。为懂得决这个成绩,我们须要一种可能静态调剂大小的数据构造,这就是C言语中的vector。本文将深刻探究vector的道理、实现方法以及如何在现实项目中利用它。

vector的道理

vector在C言语中是一种静态数组,它可能在运转时根据须要主动调剂大小。与静态数组差别,vector利用静态内存分配来存储数据,这意味着它可能在须要时增加或增加存储空间。

静态内存分配

在C言语中,静态内存分配平日利用malloccallocrealloc等函数。这些函数容许我们在堆上分配内存,从而实现静态数组。

vector的实现

以下是一个简单的vector实现示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *data;
    int size;
    int capacity;
} Vector;

void vector_init(Vector *v, int capacity) {
    v->data = (int *)malloc(capacity * sizeof(int));
    v->size = 0;
    v->capacity = capacity;
}

void vector_free(Vector *v) {
    free(v->data);
    v->data = NULL;
    v->size = 0;
    v->capacity = 0;
}

void vector_pushback(Vector *v, int value) {
    if (v->size == v->capacity) {
        v->capacity *= 2;
        v->data = (int *)realloc(v->data, v->capacity * sizeof(int));
    }
    v->data[v->size++] = value;
}

int vector_get(Vector *v, int index) {
    if (index < 0 || index >= v->size) {
        return -1;
    }
    return v->data[index];
}

void vector_print(Vector *v) {
    for (int i = 0; i < v->size; i++) {
        printf("%d ", v->data[i]);
    }
    printf("\n");
}

int main() {
    Vector v;
    vector_init(&v, 10);

    for (int i = 0; i < 15; i++) {
        vector_pushback(&v, i);
    }

    vector_print(&v);

    vector_free(&v);

    return 0;
}

vector的上风

vector的利用

在现实项目中,vector可能用于存储各品种型的数据,如整数、浮点数、字符串等。以下是一些利用vector的示例:

存储整数

int main() {
    Vector v;
    vector_init(&v, 10);

    for (int i = 0; i < 15; i++) {
        vector_pushback(&v, i);
    }

    vector_print(&v);

    vector_free(&v);

    return 0;
}

存储字符串

#include <string.h>

typedef struct {
    char **data;
    int size;
    int capacity;
} VectorString;

void vectorstring_init(VectorString *v, int capacity) {
    v->data = (char **)malloc(capacity * sizeof(char *));
    v->size = 0;
    v->capacity = capacity;
}

void vectorstring_free(VectorString *v) {
    for (int i = 0; i < v->size; i++) {
        free(v->data[i]);
    }
    free(v->data);
    v->data = NULL;
    v->size = 0;
    v->capacity = 0;
}

void vectorstring_pushback(VectorString *v, char *value) {
    if (v->size == v->capacity) {
        v->capacity *= 2;
        v->data = (char **)realloc(v->data, v->capacity * sizeof(char *));
    }
    v->data[v->size++] = value;
}

int main() {
    VectorString v;
    vectorstring_init(&v, 10);

    vectorstring_pushback(&v, "Hello");
    vectorstring_pushback(&v, "World");

    for (int i = 0; i < v.size; i++) {
        printf("%s\n", v.data[i]);
    }

    vectorstring_free(&v);

    return 0;
}

总结

vector是C言语中一种高效、机动的静态数组。经由过程本文的介绍,信赖你曾经对vector有了深刻的懂得。在现实项目中,公道利用vector可能进步代码的效力跟可读性。