我一直在考虑使用 C 而不是 C++,因为我发现它更干净,而且我发现它主要缺少的是像数组这样的向量。
最好的实现是什么?
我希望能够调用诸如 vector_create、vector_at、vector_add 等之类的东西。
编辑
这个答案来自一百万年前,但在某个时候,我实际上在 C 中实现了一个基于宏的、高效的、类型安全的向量,它涵盖了所有典型的功能和需求。你可以在这里找到它:
https://github.com/eteran/c-vector
原答案如下。
您想要复制的载体怎么样?我的意思是,最后,这一切都归结为这样:
int *create_vector(size_t n) {
return malloc(n * sizeof(int));
}
void delete_vector(int *v) {
free(v);
}
int *resize_vector(int *v, size_t n) {
return realloc(v, n * sizeof(int));
/* returns NULL on failure here */
}
Run Code Online (Sandbox Code Playgroud)
您可以将这一切包装在一个结构中,这样它也“知道它的大小”,但是您必须为每种类型(这里的宏?)执行此操作,但这似乎有点不必要......也许是这样的:
typedef struct {
size_t size;
int *data;
} int_vector;
int_vector *create_vector(size_t n) {
int_vector *p = malloc(sizeof(int_vector));
if(p) {
p->data = malloc(n * sizeof(int));
p->size = n;
}
return p;
}
void delete_vector(int_vector *v) {
if(v) {
free(v->data);
free(v);
}
}
size_t resize_vector(int_vector *v, size_t n) {
if(v) {
int *p = realloc(v->data, n * sizeof(int));
if(p) {
v->data = p;
v->size = n;
}
return v->size;
}
return 0;
}
int get_vector(int_vector *v, size_t n) {
if(v && n < v->size) {
return v->data[n];
}
/* return some error value, i'm doing -1 here,
* std::vector would throw an exception if using at()
* or have UB if using [] */
return -1;
}
void set_vector(int_vector *v, size_t n, int x) {
if(v) {
if(n >= v->size) {
resize_vector(v, n);
}
v->data[n] = x;
}
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以执行以下操作:
int_vector *v = create_vector(10);
set_vector(v, 0, 123);
Run Code Online (Sandbox Code Playgroud)
我不知道,这似乎不值得付出努力。