c - C++ベクトルの最高のC実装は何ですか?

c arrays vector

私はC++よりもCを使用することを検討してきましたが、それがよりクリーンであり、配列のようなベクターが欠けていることがわかっています。

これの最良の実装は何ですか?

vector_create、vector_at、vector_addなどを呼び出すことができるようにしたいだけです。
答え
複製しようとしているベクターについてはどうですか?つまり、結局のところ、次のようなことになります。

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 - AIX 6.1:警告:重複したシンボル:

c - 定義されている場合(__AIX)はAIX 6.1で動作しませんか?

c - 「異なるサイズの整数からポインタへのキャスト」とはどういう意味ですか?

c - LIFOの順序ではなく、アドレスの順序でフリーリストを整理する利点は何ですか?

c++ - C++でのCライブラリ関数の実装

c - malloc実装での空きリストの維持

c - Cのファイルから数値を読み取る

c - すでに印刷されている改行を削除するVT100エスケープシーケンス?

c - 独自のベーシックディスクスキャナーを作成する方法

c++ - 警告—ポインターと組み合わせた算術式の不審な切り捨て