C++ 向量的最佳 C 实现是什么?

Wil*_*3uk 9 c arrays vector

我一直在考虑使用 C 而不是 C++,因为我发现它更干净,而且我发现它主要缺少的是像数组这样的向量。

最好的实现是什么?

我希望能够调用诸如 vector_create、vector_at、vector_add 等之类的东西。

Eva*_*ran 9

编辑

这个答案来自一百万年前,但在某个时候,我实际上在 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)

我不知道,这似乎不值得付出努力。