【发布时间】:2016-12-27 09:47:21
【问题描述】:
我自己实现了HashMap/HashTable(我知道它们不同,但与这个问题无关)。
在这个实现中,我希望它非常灵活。我希望能够将整数、结构、字符、字符串等全部存储为键或值,而无需更改算法的代码。例如,在 Java 中我可以这样做:
HashMap<Integer, MyPersonalClass> 它会正常工作。在 C 中,我知道除了void* 之外没有直接的等价物。问题是,如果我有:
/* Node structure. */
struct hm_Node
{
void *key, *value;
struct hm_Node *next;
};
作为构成我的HashMap/HashTable 的节点,我的hash() 方法需要以某种方式正确解析key。到目前为止,我只查找了char* 的算法。
有没有类似的东西:
// This may not be valid code, just using it as an example
unsigned int hash(void *ptr)
{
switch(typeof(ptr)) // I know ptr is of type void*
{
case char*: ... break;
case char: ... break;
case int: ... break;
}
}
具体是如何工作的?我只是想避免对 X、Y 和 Z 类型的 HashMap 进行完全不同的实现。谢谢。
【问题讨论】:
-
欢迎来到 C。没有什么神奇的,你带上你自己的肌肉。
-
您无法提取类型
void *是“隐藏”(例如使用(void *)&something)。 -
@KerrekSB 所以....我该怎么办?假设我想要多个
HashMaps,每个key都有不同的类型。一个key将是double,另一个是string。当然,我不会复制粘贴整个HashMap.c和HashMap.h并制作HashMapForDoubles.c和HashMapForDoubles.h -
@Hatefiend:不,你没有,但你需要准备好在这方面投入大量的工作。基本上,您需要实现一个 ad-hoc vtable,并为每种类型创建所有相关的访问器函数(添加、查找、删除)。然后,对于您要使用的每种具体类型,您使用相应的访问器函数填充一个 vtable,并将该 vtable 传递给您的通用哈希表算法。
-
一些事情。什么是
ad-hoc vtable?另外,为什么每种类型都需要addfind和delete方法?我的put方法只是创建了一个Node,它具有void*到key和value所放置的任何内容。确定是hash方法需要考虑所有不同的类型,而不是任何其他方法?