为什么标准C库中没有Hashtable支持?这有什么特别的原因吗?
答案 0 :(得分:45)
如果您喜欢C,那么可以将其视为“空白”...您的整个应用程序都是由您编写的代码和您选择引入的库组成的,还有一些相当原始的标准库函数,可能一两个例外,例如qsort
。人们现在使用C来实现Python,Ruby,Apache或Linux内核之类的东西。这些项目无论如何都使用了他们自己的所有数据结构,他们不太可能使用类似STL的东西。
许多C库实现了通用哈希表。有权衡,你可以选择自己喜欢的。其中一些可以使用回调进行配置。
如果所有这些库都能满足您的需求,那么将哈希表添加到C标准的重点是什么?
答案 1 :(得分:39)
标准C库中没有哈希表,因为:
这就是ISO的工作方式。提案被提出并被接受或拒绝。
您必须小心添加到标准库中的内容,因为您有两个冲突的组。作为用户,您可能希望将太阳下的每个数据结构添加到标准中,以使语言更有用。
但是,作为一种语言实现者(顺便说一下,这些可能是那些倾向于构成各个工作组大部分的人,因此他们的观点可能会产生更大的影响),你不要真的很想要实现每个人都不会使用的东西的麻烦。 C89出现时所有的东西都与这样一个事实有关,即主要目的是编纂现有的做法,而不是引入新的做法。从那以后,标准的所有迭代都可以做得更自由,但向后兼容性仍然是一个重要的问题。
我自己,我也有冲突。我很乐意在C语言中拥有Java,C ++或Python库的所有功能。当然,这会让新手学习一切变得更加困难,而且正如一位评论者所说,可能会让它变得如此代码猴可以抽出有用的代码,减少我在这个过程中的价值: - )
我几乎拥有我需要的所有数据结构,从我的长期和(大部分)杰出的职业生涯中。你不仅限于这种东西的标准库。你有很多第三方工具可以完成这项工作,而且(像我一样)你也可以自己动手。
如果您想知道为什么在每次迭代中做出某些决定,ISO(最初是ANSI,在ISO接管之前)通常会发布基本原理文档。可以找到ANSI中的C89 here。它包含了范围内的这个小美:
此基本原理主要侧重于基础文档中所述的语言的添加,说明和更改。这不是整个C语言的理由:委员会负责编纂现有语言,而不是设计一种新语言。在这个基本原理中没有试图捍卫语言的预先存在的语法,例如声明的语法或运算符的绑定。
我特别欣慰地承认,他们不会对任何可能早于标准化的邪恶混乱负责。
但是,也许你的问题的真正答案在于这一点,指导原则之一:
保持C的精神。委员会将保持C的传统精神作为一个主要目标.C的精神有许多方面,但其实质是社区的情感。 C语言所依据的基本原则。 C精神的某些方面可以用以下短语概括:
第三个可能是图书馆没有通过最初的标准化工作大规模扩展的主要原因 - 而且,委员会的这种扩展可能导致ANSI C被标记为C2038而不是C89
答案 2 :(得分:10)
标准C库不包含任何大型,持久性数据结构 - 既不是列表,也不是树,也不是堆栈,也不包括哈希表。
如果不向原始C库的作者询问,就不可能给出确定的答案。然而,一个似是而非的解释是,这种数据结构的实现涉及各种权衡,只有应用程序的作者才能做出这些权衡。
请注意,POSIX标准C库确实指定了通用哈希表函数:hcreate()
,hsearch()
和hdestroy()
;并注意到他们的“一刀切”性质往往使它们不适合大多数现实世界的用例,支持上述论点。
答案 3 :(得分:1)
由于缺少模板
这是一个猜测,但没有像C ++这样的语言模板确实使得实现容器非常不优雅,因为您需要几十个定义来涵盖所有可能的类型,更不用说用户定义的类型了。
有一些C策略可以解决这个问题,就像玩void *
一样,但它们会失去编译时类型检查。
GLib和gnulib是我目前推荐的实现:Quick Way to Implement Dictionary in C