【问题标题】:C hash table multiple type inputC哈希表多类型输入
【发布时间】:2017-06-14 14:08:49
【问题描述】:

作为一名进步的 C 程序员,我一直在研究哈希表。该表运行良好,高效(在一定程度上)且易于实现,但我遇到的一个问题是它只接受 const char * 作为值类型。我想实现一种方法来拥有其他数据类型,而不必为每种类型写出方法。这是因为我必须创建多个结构来保存每个数据,然后当然需要重写所有方法以匹配这些新结构,这会变得很长并且容易出错。

有更简单的方法吗?

编辑

要了解更多信息和示例,其中一种方法是 void InsertInto(Hash_Table DataBase, const char * key, const char * value); 这很有效,因为键始终是字符串名称,但值类型不能只是 char,我还需要它为 int、float 和 double,以使其对我的使用有效。而且截至目前,我有struct element { struct element * next, char * key, char * value }; 我也意识到这需要变得不同才能容纳所有类型。以答案为例,将不胜感激,但并非完全必要。

【问题讨论】:

  • C 没有一种适合所有人的类型。最多你可以编写你的表来保存void* 并提供回调,在适当地散列之前将其转换回具体类型。
  • 使用宏来模拟模板。除非你喜欢调试,否则不要使用 void*。
  • 以一种悲伤和不受欢迎的方式,切换到可以进行方法重载的 C++ 会更容易吗?因为作为附加背景,我正在尝试创建一种编程语言。 C 似乎是初学者 lang 开发人员的最佳选择,但 C++ 只是更好的选择?
  • 好吧,你会使用模板。是的,这可能会更容易,但你也会学到更少。
  • 您应该接受@2501 所说的“少学习”,使用带有一粒盐的模板。它远没有看起来那么简单,而且还有很多关于编写好的模板化容器的知识。

标签: c hashtable


【解决方案1】:

没问题。只需传递一个具有相关大小的 void * 即可。转换为 unsigned char * 以进行散列。

【讨论】:

  • 稍微更多地参与。类型擦除意味着无法在哈希表一侧进行强制转换。它必须接受几乎所有需要知道具体类型才能进行操作的操作的回调。
  • 哈希表只支持插入、检索、删除。调用代码必须知道我们对键和对象使用什么类型,但无论如何它必须知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2023-03-04
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多