c - C++ vector 的最佳 C 实现是什么?

标签 c arrays vector

我一直在研究在 C++ 上使用 C,因为我发现它更清晰,而且我发现它缺少的主要内容是像数组这样的 vector 。

什么是最好的实现?

我只想能够调用诸如 vector_create、vector_at、vector_add 之类的东西。

最佳答案

编辑
这个答案来自一百万年前,但在某个时候,我实际上在 C 中实现了一个基于宏的、高效的、类型安全的 vector 工作,它涵盖了所有典型的功能和需求。你可以在这里找到它:
https://github.com/eteran/c-vector
原答案如下。

你想要复制的 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 */
}
你可以把这一切都包装在一个结构中,所以它也“知道它的大小”,但你必须为每种类型(这里的宏?)都这样做,但这似乎有点不必要......也许是这样的:
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) {
            p->data = p;
            p->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;
    }
}
之后,你可以这样做:
int_vector *v = create_vector(10);
set_vector(v, 0, 123);
我不知道,这似乎不值得付出努力。

关于c - C++ vector 的最佳 C 实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826163/

相关文章:

c - 为什么这个 C 程序不提取转义的反斜杠?

c - 指针表达式 "based on"何时是另一个指针?

c - 如何进行 "superlong"整数的乘法和除法?

java - 将随机数组输出到文件

python - Sympy:如何计算矩阵相对于向量场的李导数

c++ - 将浮点值的 std::vector 传递给函数会稍微改变值

c - on_exit 和 CTRL+C

c - 取消引用指针的后增量?

arrays - 我可以迭代数组数组并将其与整数数组进行比较吗

c++ vector 类中的调试中断