#include #include #include #include #include "vector.h" #include "util.h" #define VECTOR_START_SIZE 8 #define VECTOR_GROW_FACTOR 2 #define ITEMSZ sizeof(int) void vector_init(ivector *v) { assert(v); v->n = 0; v->maxsz = VECTOR_START_SIZE; v->data = xmalloc(ITEMSZ * VECTOR_START_SIZE); } void vector_initdata(ivector *v, int *arr, size_t arrsz) { assert(v && arrsz); // v->n = arrsz; v->maxsz = arrsz; v->data = xmalloc(ITEMSZ * arrsz); memcpy (v->data, arr, ITEMSZ * arrsz); } void vector_free(ivector *v) { assert(v); v->n = 0; v->maxsz = 0; xfree(v->data); v->data = NULL; } size_t vector_len(const ivector *v) { assert(v); // return v->n; } int * vector_data(const ivector *v) { assert(v); // return v->data; } void vector_resize(ivector *v, int n) { assert(v); if (n > v->maxsz) { // Увеличиваем capacity size_t new_maxsz = v->maxsz; while (new_maxsz < n) { new_maxsz *= VECTOR_GROW_FACTOR; } // Сохраняем старый указатель int *old_data = v->data; v->data = xmalloc(ITEMSZ * new_maxsz); // Копируем старые данные if (old_data) { memcpy(v->data, old_data, ITEMSZ * v->n); xfree(old_data); } // Обнуляем новую память for (size_t i = v->n; i < new_maxsz; i++) { v->data[i] = 0; } v->maxsz = new_maxsz; } else if (n > v->n) { // Если увеличиваем размер в пределах capacity, обнуляем новые элементы for (size_t i = v->n; i < n; i++) { v->data[i] = 0; } } v->n = n; } void vector_set(ivector *v, size_t idx, int val) { assert(v && idx < v->n); // v->data[idx] = val; } int vector_get(const ivector *v, size_t idx) { assert(v && idx < v->n); // return v->data[idx]; } void vector_push(ivector *v, int val) { assert(v); // Проверяем, нужно ли увеличить capacity if (v->n >= v->maxsz) { size_t new_maxsz = v->maxsz * VECTOR_GROW_FACTOR; v->data = xrealloc(v->data, ITEMSZ * new_maxsz); v->maxsz = new_maxsz; } // Добавляем элемент v->data[v->n] = val; v->n++; } void vector_pop(ivector *v) { assert(v); if (v->n > 0) { v->n--; } // Если вектор пуст, ничего не делаем (без assert) } void vector_insert(ivector *v, size_t idx, int val) { assert(v && v->n >= idx); // if(v->n == v->maxsz){ size_t new_maxsz = v->maxsz * VECTOR_GROW_FACTOR; if (new_maxsz==0) new_maxsz = VECTOR_START_SIZE; vector_resize (v, (int)new_maxsz); } memmove(v->data+idx+1, v->data+idx, ITEMSZ * (v->n-idx)); v->data[idx]=val; v->n++; } void vector_del(ivector *v, size_t idx) { // memmove(v->data+idx, v->data+idx+1, ITEMSZ * (v->n-1-idx)); v->n--; } void vector_clear(ivector *v) { vector_resize(v, 0); }