容器类/C库是什么?

80

有没有人知道任何C容器库?我正在寻找一个类似于C++ STL的东西,它可以提供链表、数组、哈希表等标准实现。主要关注点是:

  1. 客户端代码应能够创建多种不同数据类型的容器,而无需修改库。
  2. 创建和使用容器的接口应该直观易懂。
8个回答

26

当我在寻找一个C语言实现的map/dictionary容器时,我偶然发现了SGLIB。不幸的是,它似乎没有提供map容器,但它好像包含了你所问的其他容器。我不知道它有多好。

http://sglib.sourceforge.net.


3
截至2013-07,那个SourceForge项目似乎已经停滞了。我注意到文档中没有提到“错误”一词,也没有提到任何错误处理。Jacob Navia的C容器库在这方面要好得多,并且有大约370页的正式文档 - 但可悲的是,他的ccl不是开源的。 - Alex North-Keys
截至2014年5月,该链接并未失效。 - 101010
1
实际上,Jacob Navia的C容器库是开源的 - 请参见https://code.google.com/p/ccl/ - 我给作者发了电子邮件并确认在他网站的其他地方提到的“非商业”限制不适用于CCL。 - starseeker

11

Sglib 是一款非常优秀的通用数据结构库。该库目前提供了以下通用实现:

  • 数组排序
  • 单向链表
  • 有序单向链表
  • 双向链表
  • 红黑树
  • 哈希容器

它的速度非常快,比 glib 还要快。它的灵感来自于标准模板库。 下载链接

另一个解决方案是 Attractive Chaos sotware。C 宏库:
kbtree.h:C 语言中高效的 B 树库。
khash.h:C 语言中快速轻量级的哈希表库。
kvec.h:C 语言中简单的向量容器。

Kulesh Shanmugasundaram 提出了基于 Linux 内核链表的通用 Linux 内核链表和通用哈希表。

Sglib、Attractive Chaos sotware 和 Linux Kernel Linked List 都是 C 宏库。在 C 中使用 void* 实现通用容器可能效率低下。C 宏模仿 C++ 模板,与 C++ 模板一样高效。


2
你说:“在C语言中使用void*实现通用容器可能会效率低下。”-- 你能否解释一下你为什么这样认为? - Arun
@Arun 我猜这可能与内存局部性不好有关。你可以在一些数据结构中很好地放置数据,但是通用的 void * 可能会指向进程地址空间的各个位置。 - val is still with Monica

10

Chuck Falconer编写了一份不错的哈希库,包含C++接口,点击网页上的hashlib.zip进行下载。

Ben Pfaff拥有非常好的、极其详细的二叉树和平衡树库——GNU libavl,它实现了大多数主要的树结构,包括二叉搜索树、AVL树、红黑树以及每种树的线索化版本。

libavl在2.0.3版本后采用了LGPL许可证,而hashlib则是GPL。

对于数组和链表,我不确定您需要什么样的支持,因为前者直接被语言支持,而后者通常足够简单,无需使用库来实现。


1
我最近看了Chuck Falconer的哈希表,它非常不错。我唯一的抱怨是不清楚是否可以在商业项目中使用它。他要求您与他联系以获得许可。 - Nick Van Brunt
2
@Nick:关于使用Falconer的hashlib代码的许可权限,实际上并没有什么不清楚的地方:它明确地在GPL下授权。如果你的商业代码符合GPL条款(基本上如果你的商业代码也是GPL许可),那就没必要联系他了。如果你想要其他的许可条款而不是GPL,他也愿意接受联系。 - Michael Burr
2
@Michael Burr:GPL和LGPL简而言之意味着不能在商业环境或真正的开源环境中使用。我建议那些考虑这个作为解决方案的人另寻他处。 - Matthieu N.
1
@Zenikoder:对于许多商业项目来说,这是真实的,甚至可能是大多数。但是,GPL或LGPL代码是否可以在商业项目中使用的具体情况完全取决于商业项目的要求。我曾在几个地方工作过,只要LGPL代码仅以DLL形式使用,就可以使用它们。 - Michael Burr

8

那么ccl怎么样?这是一个容器库,曾经提出过将其作为C标准的一部分(但未成功)。也许它最适合你。您可以查看 https://github.com/jacob-navia/ccl。 享受它。


2
这个答案之前并没有被@navicore提供过。他所说的是一个缩写略有不同的不同库。 - Alex North-Keys

5

我一直在使用一个库,这个库是从汉森的“C接口与实现”一书中学习并发展而来的。他的源代码可以从以下网站下载:

cii book website

所有东西都是抽象数据类型。有列表、集合和表(映射)。


4
最终,您可以在http://code.google.com/p/cii/找到该代码,并且它是在非常灵活的MIT许可下获得许可。 - Jonathan Leffler
这个库似乎没有提供C风格的细粒度错误处理,而是采用了setjmp/longjmp异常的粗略方法。它不适合需要保证运行时间的代码。 - Alex North-Keys

2

我听说过一些编程库,但从未使用过,其中包括:

  • Glib
  • iMatix标准函数库
  • 来自Linux内核头文件的不同元素(例如list)

2

要获取单链表、单链尾队列、列表和尾队列的实现,请使用#include "queue.h"

我发现 D. J. Bernstein (http://cr.yp.to/djbdns.html) 编写了一个通用缓存,可以在内存中存储任意对象,它既干净简洁又超级快速。请查看 djdns tarball 中的 cache.h 和 cache.c。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接