C语言中的高级数据结构

4
可能重复:
C++ STL的类在C中的相似替代品 经常情况下,在进行C编程时,我希望能够像C++的vector或list类一样使用某种高级数据结构,并且最终实现了某种削减版本的高级数据结构,但这需要花费相当多的时间。 我想知道是否有人知道一个好的库,其中包含高质量、简单的C数据结构?

1
https://dev59.com/oXVC5IYBdhLWcg3wtzut - darlinton
3个回答

5

嗯,这里有一个库叫做GLib,它是用来实现GTK+窗口部件集的。GLib使用GObject作为在C语言中进行面向对象编程的方式。但是,GObject化的C语言因其冗长而闻名。


谢谢,但我正在寻找比那个更轻量级的东西。 - Slubb
GLib并不“沉重”,只是要避免在C语言中使用GObjects和假装面向对象。 - ShinTakezou

1

除了像其他人建议的GLib之外,您可以创建自己的通用类型,没有任何类型安全性,例如使用void *作为指向下一个堆栈对象的通用指针的链表。有些人甚至使用宏在ANSI C中创建类似模板的行为,并取得了一些合理的成功。在cplusplus.com的论坛上搜索一个或两个示例(如果我没记错的话,那里还不多)。

另外,您可以按照Object-Oriented Programming With ANSI C中描述的方式实现自己的面向对象方案,但这不是我推荐的东西。你可能会花费时间来创建那个“野兽”(最终可能不理解它如何工作),并学习GLib以熟悉它。

个人而言,我更喜欢第一种方法。虽然你会失去类型安全性并增加大量的强制转换,但这是最快实现的方法。那种方法的真正问题在于存储的数据。std::stack<int>在转换成C时只是一个名为stack的结构体,其中有一个数据字段类型是int。那么std::vector<std::stack<int> >呢?这是一个可寻址的整数堆栈列表。C标准不能保证从指针类型到整型的强制转换将不会丢失信息。换句话说,尽管你可以使用指针,但无法使用纯整数来存储信息。也许一些展开的模板专业化会起作用 —— 一个用于int,(一个用于long long吗?),一个用于double,还有一个用于指针类型。

最终,最好的解决方案是使用像GLib这样的库,但如果你喜欢自己编写,创造时要小心。你永远不知道何时需要将容器中的项类型组合在一起。


1
C标准不能保证从指针类型到整数类型的转换不会丢失信息。 (C99)标准在stdint.h中包括intptr_t以实现此目的。 - Chris Lutz
是的,确实如此,但其他整数类型不能保证将信息完整保存。不能可靠地说当 sizeof(void*) == 16(128位指针)时,int64_t(__int64适用于MSVC用户)将能够保存void*的值。虽然这样的系统可能只存在于理论上,但不能依赖此类代码。没有什么是未来可靠的,但至少可以尝试避免代码中断。 - user539810
如果有符号类型的TYPE_MAX >= INTPTR_MAX或无符号类型的TYPE_MAX >= UINTPTR_MAX,或者更一般地(在运行时)如果sizeof(type) >= sizeof(void *),则可以轻松地保证其他整数类型保存这些信息。但是,如果您要在void *中存储数字数据,您始终可以反转测试,或者只需始终使用(u)intptr_t并让隐式整数转换处理任何潜在问题。 - Chris Lutz

0

我喜欢使用GLib来处理这种事情;你最终编写的代码很干净,库易于使用、稳定、成熟且跨平台,文档也非常好。

你可能还想看看Rusty Russell的CCAN项目。虽然我没有使用过其中的任何代码,但下次有类似需求时我一定会去尝试一下:

http://ccan.ozlabs.org/

思路
优秀的 C 代码片段应该从垃圾代码目录中移出,并暴露给更广泛的世界,这样它们才能成为有用的东西。
CCAN 的松散模型是 Perl 代码开发和共享成功项目 CPAN。

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