引言
在C言語中,固然數組是一種常用的數據構造,但它們的大小在定義時就曾經牢固,無法在運轉時靜態調劑。為懂得決這個成績,我們須要一種可能靜態調劑大小的數據構造,這就是C言語中的vector。本文將深刻探究vector的道理、實現方法以及如何在現實項目中利用它。
vector的道理
vector在C言語中是一種靜態數組,它可能在運轉時根據須要主動調劑大小。與靜態數組差別,vector利用靜態內存分配來存儲數據,這意味着它可能在須要時增加或增加存儲空間。
靜態內存分配
在C言語中,靜態內存分配平日利用malloc
、calloc
跟realloc
等函數。這些函數容許我們在堆上分配內存,從而實現靜態數組。
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供給了一系列函數,如
pushback
、popback
、insert
、remove
等,便利用戶操縱。
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可能進步代碼的效力跟可讀性。