可能重复:
C Analog To STL
通常情况下,在使用C语言进行编程时,我发现自己希望能够访问类似C ++中的向量或列表类的内容,并最终实现了某种高级数据结构的精简版本,但是这需要相当长的时间。我想知道是否有人知道C中的高质量简单数据结构库?
答案 0 :(得分:5)
答案 1 :(得分:1)
除了其他人建议的GLib之外,您可以创建自己的泛型类型,而不需要任何类型安全性,例如使用void *
作为指向下一个堆栈对象的通用指针的链接列表。有些甚至使用宏在ANSI C中创建类似模板的行为,但取得了一些合理的成功。在cplusplus.com的论坛中搜索一两个例子(如果我没记错的话,还有很多比。)
或者你可以按照文章Object-Oriented Programming With ANSI C中的描述实现自己的OOP方案,尽管这是我不推荐的。你也可以花时间去创造这种野兽(并且最终可能不了解它是如何工作的)并学习一些GLib来熟悉它。
我个人更喜欢第一种方法。你失去了类型安全性并获得了很多演员表,但它实现起来最快。该方法的真正问题是存储的数据。转换为C的std::stack<int>
只是一个具有int类型数据字段的结构堆栈。那么std::vector<std::stack<int> >
,一个可寻址的整数堆栈列表呢? C标准不能保证从指针类型到整数类型的转换可以在没有信息丢失的情况下工作。换句话说,虽然您必须使用指针,但不能使用普通整数来存储信息。也许一些展开的模板特化可以工作 - 一个用于int,一个用于long long?),一个用于double,一个用于指针类型。
最后,最好的解决方案是使用像GLib这样的库,但是如果您喜欢自己滚动,请在创建它时注意。你永远不知道什么时候你需要在容器中组合各种类型的物品。
答案 2 :(得分:0)
我喜欢GLib这种东西;您最终编写的代码很简洁,库易于使用,稳定,成熟且跨平台,文档非常好。
您可能还想看看Rusty Russell的CCAN项目。我没有使用它的任何代码,但我肯定会在下次有类似的需求时蘸我的脚趾:
理念
C代码的好片段应该从junkcode目录中移出并暴露给更广阔的世界,在那里它们可以成为有用的东西。
在成功完成Perl代码开发的CPAN项目之后,CCAN被松散地建模 共享。