Многие проекты на C в конечном итоге реализуют API-интерфейс, похожий на вектор.Динамические массивы настолько распространены, что приятно абстрагировать управление памятью как можно больше.Типичная реализация C может выглядеть примерно так:
typedef struct dynamic_array_struct
{
int* data;
size_t capacity; /* total capacity */
size_t size; /* number of elements in vector */
} vector;
Тогда они будут иметь различные вызовы функций API, которые работают с vector
:
int vector_init(vector* v, size_t init_capacity)
{
v->data = malloc(init_capacity * sizeof(int));
if (!v->data) return -1;
v->size = 0;
v->capacity = init_capacity;
return 0; /* success */
}
Тогда, конечно, вам нужны функциидля push_back
, insert
, resize
и т. д., что вызовет realloc
, если size
превышает capacity
.
vector_resize(vector* v, size_t new_size);
vector_push_back(vector* v, int element);
Обычно, когда требуется перераспределение, capacity
удваивается, чтобы избежать перераспределения все время.Обычно это та же самая стратегия, которая используется внутри std::vector
, за исключением того, что обычно std::vector
не вызовет realloc
из-за конструкции / разрушения объекта C ++.Скорее, std::vector
может выделить новый буфер, а затем скопировать конструкции / перемещения объектов (используя размещение new
) в новый буфер.
Реальная реализация вектора в C может использовать void*
указателив качестве элементов, а не int
, поэтому код является более общим.Во всяком случае, такие вещи реализованы во многих проектах на Си.См. http://codingrecipes.com/implementation-of-a-vector-data-structure-in-c для примера реализации вектора в C.