C中的通用哈希表

mct*_*nne 5 c hashtable hashmap

我试图在C中创建一个通用哈希表。我已经阅读了几种不同的实现,并遇到了几种不同的方法。

首先是使用像这样的宏:http : //attractivechaos.awardspace.com/khash.h.html

第二种是使用带有2个void指针的结构,如下所示:

struct hashmap_entry
{
    void *key;
    void *value;
};
Run Code Online (Sandbox Code Playgroud)

据我所知,这种方法并不是很好,因为它意味着映射中的每个条目都至少需要2种分配:一种分配给键,一种分配给值,而与存储的数据类型无关。(那正确吗???)

如果没有采用宏路由,就无法找到一种使它通用的不错的方法。有人有任何提示或示例可以帮助我吗?

vir*_*tor 1

C 没有通用数据类型,因此您想要做的事情(没有额外的分配和void*转换)实际上是不可能的。您可以使用宏来动态生成正确的数据函数/结构,但您也试图避免使用宏。

所以你需要放弃至少一个想法。

您可以通过分配以下内容来拥有通用数据结构,而无需额外分配:

size_t key_len;
size_t val_len;
char key[];
char val[];
Run Code Online (Sandbox Code Playgroud)

一口气然后分发 void 指针,或者为每种特定类型添加 api。

或者,如果您需要处理的类型数量有限,您也可以使用正确的类型标记该值,这样现在每个条目都包含:

size_t key_len;
size_t val_len;
int val_type;
char key[];
char val[];
Run Code Online (Sandbox Code Playgroud)

但在 API 中至少你可以验证请求的类型是否正确。

否则,为了使所有内容通用,您只能使用宏或更改语言。

  • 好吧,C 结构体可以有灵活的数组成员(每个成员最多一个),所以你的断言不太正确。但无论如何,现在我*确定*我不遵循你实际建议的内容,或者它如何比他提出的替代方案更好地服务于OP的目标。 (2认同)