C的容器类/库[关闭]

Posted

技术标签:

【中文标题】C的容器类/库[关闭]【英文标题】:Container Class / Library for C [closed] 【发布时间】:2010-09-23 06:23:44 【问题描述】:

有人知道任何 C 容器库吗?我正在寻找能够提供链表、数组、哈希表等标准实现的东西,与 C++ STL 所做的方式非常相似。主要关注点是:

    客户端代码应该能够为多种不同的数据类型创建容器,而无需修改库。 创建和使用容器的界面应该很直观。

【问题讨论】:

【参考方案1】:

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

http://sglib.sourceforge.net.

【讨论】:

截至 2013 年 7 月,该 sourceforge 项目似乎已死。我注意到文档没有在任何地方提到“错误”这个词,也没有提到任何错误处理。 Jacob Navia 的 C Container Library 在这方面要好得多,并且有大约 370 页的正式文档 - 但遗憾的是,他的 ccl 不是开源的。 截至 2014 年 5 月,该链接并未失效。 实际上,Jacob Navia 的 C 容器库是开源的 - 请参阅 code.google.com/p/ccl - 我给作者发了电子邮件并确认他网站上其他地方提到的“非商业”限制不适用于 CCL。 【参考方案2】:

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

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

速度非常快。更快的油嘴滑舌。它的灵感来自标准模板库。 Download here

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

Kulesh Shanmugasundaram 提供通用 Linux 内核链接列表和基于 Linux 内核链接列表的通用哈希表。

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

【讨论】:

您说“使用 void* 在 C 中实现通用容器可能效率低下。” -- 你能解释一下你为什么这么认为吗? @Arun 我猜这与糟糕的内存局部性有关。您可以将数据很好地放置在某些数据结构中,但通用 void * 可能会指向整个进程的地址空间。【参考方案3】:

Chuck Falconer有一个不错的C语言哈希库,包含C++接口,点击网页上的hashlib.zip下载。

Ben Pfaff 有一个非常漂亮且文档非常完善的二叉树和平衡树库 GNU libavl,它实现了大多数主要的树结构,包括二叉搜索树、AVL 树、红黑树和每个树的线程版本。

libavl 在 LGPL 下获得许可(从 2.0.3 版开始),hashlib 是 GPL。

就数组和链表而言,我不确定您在寻找什么,因为前者由语言直接支持,而后者通常很简单,无需库即可实现。

【讨论】:

我最近查看了 Chuck Falconer 的哈希表,它非常好。我唯一的抱怨是不清楚是否可以在商业项目中使用它。他要求你联系他以获得许可。 @Nick:关于使用 Falconer 的 hashlib 代码的权限真的没有什么不清楚的:它显然是在 GPL 下获得许可的。如果您的商业代码符合 GPL 条款(基本上如果您的商业代码也是 GPL 许可),则无需联系他。如果您想要 GPL 以外的其他许可条款,他愿意就此事与他联系。 @Michael Burr:GPL 和 LGPL 简而言之意味着不能在商业环境或真正的开源环境中使用。我也建议那些认为这是寻找其他解决方案的人。 @Zenikoder:对于许多甚至大多数商业项目来说都是如此。但是 GPL 或 LGPL 代码是否可以用于商业项目的细节完全取决于商业项目的要求。我在几个地方都可以使用 LGPL 代码,只要它只以 DLL 形式使用。【参考方案4】:

ccl怎么样?这是一个 C 的容器库。也许它最适合你。你可以看到https://code.google.com/p/ccl/。 尽情享受吧。

【讨论】:

@navicore 已经没有给出了这个答案。他说的是一个不同的库,有几个像素不同的首字母缩写词。【参考方案5】:

我一直在使用从 Hanson 的“C 接口和实现”一书中发展而来的库。他的源码可以在

下载

cii book website

一切都是抽象数据类型。有List、Set、Table(地图)。

【讨论】:

最终,您会发现代码在code.google.com/p/cii,并且是在极其灵活的 MIT 许可证下获得许可的。 这个库似乎没有提供 C 风格的细粒度错误处理,而是使用 setjmp/longjmp 处理异常的粗略方法。对于正常运行时间至关重要的代码,它不是一个好的候选者。【参考方案6】:

#include "queue.h" 可以访问单链表、单链尾队列、列表和尾队列的实现。

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

【讨论】:

【参考方案7】:

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

油嘴滑舌 iMatix 标准函数库 Linux 内核头文件中的不同元素(例如列表)

【讨论】:

【参考方案8】:

这似乎涵盖了大部分容器和一些算法。也没有许可,所有标题都包含 - “代码可以不受限制地使用。” http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=13867&lngWId=3

【讨论】:

以上是关于C的容器类/库[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Qt容器类之一:Qt的容器类介绍

[Java 并发编程实战] 集合框架之 同步容器类 & 并发容器类

cpp►标准模板库STL

(Symfony 4)如何手动将供应商类添加到容器中,然后注入存储库/服务类?

Java容器类类库基本概念详解

C ++模板堆栈映射/多映射[关闭]