C的容器类/库[关闭]


78

有人知道任何C容器库吗?我正在寻找某种能够提供链表,数组,哈希表等标准实现的东西,与C ++ STL的实现方式大致相同。关键问题是:

  1. 客户端代码应该能够在不修改库的情况下为多种不同数据类型创建容器。
  2. 创建和使用容器的界面应直观。

Answers:


24

我在寻找地图/字典容器的C实现时遇到了SGLIB。不幸的是,没有地图,但它似乎包括了您询问的容器。我不知道它有多好。

http://sglib.sourceforge.net


3
截至2013年7月,该sourceforge项目似乎已死。我注意到文档在任何地方都没有提及“错误”一词,也没有提及任何错误处理。Jacob Navia的C容器库在这方面要好得多,并且有大约370页的正式文档-但可惜的是,他的ccl并不是开源的。
Alex North-Keys

截至2014年5月,该链接尚未失效。
010110110101 2014年

1
实际上,Jacob Navia的C容器库是开源的-请参阅code.google.com/p/ccl-我通过电子邮件发送给作者,并确认他网站上其他地方提到的“非商业”限制不适用于CCL。
stareeker

11

Sglib是一个出色的通用数据结构库。该库当前提供以下通用实现:

  • 排序数组
  • 链表
  • 排序链表
  • 双链表
  • 红黑树
  • 散列容器

非常快。更快的glib。它的灵感来自标准模板库。在这里下载

另一个解决方案是有吸引力的混沌软件。C宏库:
kbtree.h:C中的高效B树库
khash.h:C中的快速轻量哈希表库
。kvec.h:C中的简单矢量容器。

Kulesh Shanmugasundaram展示了通用的Linux内核链接列表和基于Linux内核链接列表的通用哈希表。

Sglib和有吸引力的Chaos软件和Linux内核链接列表是C宏库。使用void*C实现通用容器可能效率不高。C宏模仿C ++模板,并且效率与C ++模板一样。


2
您说“使用void *在C中实现通用容器可能效率不高。” -您能解释一下为什么会这样吗?
阿伦(Arun)

@Arun我想这与不良的内存位置有关。您可以将数据很好地放置在某些数据结构中,但是泛型void *可能会指向整个过程的地址空间。
瓦尔说莫妮卡于

10

Chuck Falconer有一个不错的用C语言编写的哈希库,其中包括C ++接口,请单击网页上的hashlib.zip进行下载。

Ben Pfaff有一个非常不错的文档,该文档很好地记录了二进制和平衡树GNU libavl,它实现了大多数主要的树结构,包括二进制搜索树,AVL树,红黑树以及每个树的线程版本。

libavl是根据LGPL(从2.0.3版开始)获得许可的,hashlib是GPL。

我不确定您要查找的数组和链接列表的范围,因为前者受该语言直接支持,而后者通常足够琐碎而无需保证使用库即可实现。


1
最近,我查看了Chuck Falconer的哈希表,它相当不错。我唯一的抱怨是,目前尚不清楚是否可以在商业项目中使用它。他要求您与他联系以获取许可。
尼克·范·布伦特

2
@Nick:关于使用Falconer的hashlib代码的权限确实没有什么不清楚:它显然是根据GPL许可的。如果您的商业代码符合GPL条款(基本上,如果您的商业代码也获得GPL许可),则无需与他联系。如果您想要GPL以外的其他许可条款,可以与他联系。
Michael Burr 2010年

2
@Michael Burr:GPL和LGPL简而言之,不能在商业环境或真正的开源环境中使用。我也建议那些考虑将此作为其他解决方案的人。

1
@Zenikoder:对许多甚至大多数商业项目都是如此。但是,是否可以在商业项目中使用GPL或LGPL代码的细节完全取决于商业项目的要求。只要使用DLL形式,我在两个地方使用LGPL代码就可以了。
Michael Burr


5

我一直在使用从汉森(Hanson)的“ C接口和实现”一书中获得的图书馆。他的资料可在以下网址下载

cii图书网站

一切都是抽象数据类型。有列表,集合,表(图)。


4
最终,您可以在code.google.com/p/cii上找到该代码,并且该代码已获得非常灵活的MIT许可证的许可。
乔纳森·勒夫勒

这个库似乎没有提供C风格的细粒度错误处理,但是提供了setjmp / longjmp异常的粗略处理方法。对于正常运行时间至关重要的代码,它不是一个很好的选择。
Alex North-Keys

2

#include "queue.h" 获得对单链接列表,单链接尾部队列,列表和尾部队列的实现的访问。

我发现DJ Bernstein(http://cr.yp.to/djbdns.html)用于在内存中存储任意对象的通用缓存既干净,简单又超快。在djdns tarball中查找cache.h和cache.c。


2

我听说过(但从未使用过)的一些

  • 格里布
  • iMatix标准功能库
  • Linux内核标头中的不同元素(例如列表)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.