Если я правильно сделаю вывод, что вы хотите реализовать растущие хеш-таблицы полностью универсальным способом, вам понадобится много void
указателей. Вектор не так уж сложен, просто нужно много набрать:
typedef struct {
size_t capacity, nelems;
void **contents;
} Vector;
enum { INITIAL_CAPACITY = 256 };
Vector *make_vector()
{
Vector *v = malloc(sizeof(Vector));
if (v == NULL)
return NULL;
v->capacity = INITIAL_CAPACITY;
v->contents = malloc(sizeof(void *) * v->capacity);
if (v->contents == NULL) {
free(v);
return NULL;
}
v->nelems = 0;
return v;
}
// exercise for the reader
int vector_append(Vector *, void *);
void *vector_at(Vector const *);
Имейте в виду, что общая хеш-функция будет иметь прототип size_t hash(void const *, size_t)
, т. Е. Вам нужно передать размер.
(Примечание: не OOP-функции C ++, которые вы собираетесь упустить; это шаблоны, безопасность типов, которые они покупают, и синтаксический сахар, такой как перегрузка операторов. Взгляните на OpenBSD ohash
библиотека для большего количества примеров.)