C 中是不是有一组用于动态字符串、列表和字典的标准库?
Posted
技术标签:
【中文标题】C 中是不是有一组用于动态字符串、列表和字典的标准库?【英文标题】:Is there a standard set of libraries for dynamic strings, lists, and dictionaries in C?C 中是否有一组用于动态字符串、列表和字典的标准库? 【发布时间】:2010-12-31 18:52:10 【问题描述】:我有兴趣进入 C 以接近金属性能,但想以 Python 风格编写,不想滚动我自己的动态字符串、列表和字典。 Cython 非常好,但如果可能的话,想知道如何在直接 C 中使用动态变量。
对于 C++,当然有 STL,它会为您提供 String、Vector 和 Map。当然,一种可能性是在 C++ 中以类 C 风格进行编程,仅使用这些功能。如果您需要 C 中的动态变量,这是标准做法吗?
【问题讨论】:
I'm interested in getting into C but would like to write in a Pythonic style
。不。这是C,不是python。它们大不相同。如果你想写python,写python。如果你想用 C 编写 python,你最终会得到可怕的代码。
@Falmarri:这当然是对的,但与此同时,将用一种语言学到的技术应用到另一种语言中会很有帮助。当然,前提是它不会让你的代码看起来像垃圾。
Container Class / Library for C, Any library for generic datatypes in C?, What is the most popular generic collection data structure library for C?, Standard data structure library in C? 这些都不是完全重复的,但答案或多或少是一样的...
如果您使用 C 编写 Python,您将无法获得“接近金属性能”。使用正确的习语,而不是正确的语言,是 C 快速和轻便的原因。
@R:这根本不是真的。 Python 具有 GC、高级 VM 和动态类型的严重开销,这使得用 Python 和 C 编写的相同算法在 C 中几乎绝对快得多。
【参考方案1】:
glib 挺好用的,被广泛使用:
GLib 提供核心应用 库的构建块和 用 C 编写的应用程序。它提供 GNOME 中使用的核心对象系统, 主循环实现,以及 大量的效用函数 字符串和常见的数据结构。
事实上,glib
提供的不仅仅是字符串、列表和字典的 ADT。但是您可以轻松地开始使用这些部分,然后再扩展。
也就是说,不要认为拥有动态字符串、列表和字典会使您的代码变得 Pythonic。绝大多数复杂程度以上的 C 应用程序都有此类数据结构的实现,但我不熟悉任何以“Python 风格”编写的此类应用程序。
【讨论】:
glib 有一个非常丑陋的 API;对于大多数典型任务,C++ 标准库会产生更易读的代码。 糟糕的建议,我见过的最糟糕的代码来自于 glib 的人。开始使用 C++ 工具、标准库、boost 等,不要从 C 和 #$%y 库开始。 @Gene: Boost(或至少大部分)不是改进;可以想象到的最丑陋的 C++ 模板滥用都在那里,与 crypto++ 相关联,是你可能看到的最糟糕的 C++ 代码。 glib 基本上是两全其美的(C 和 C++)。要么编写真正的 C 代码,要么使用 C++。就像自然语言一样,试图将一种编程语言的习语翻译成另一种是行不通的。它通常会导致效率极低和丑陋的代码。 @7vies:Python 的一些半函数式构造很好,但是,例如,在 Python 中几乎所有map(lambda...
的情况在编写为列表解析时都更加清晰。像 std::bind1st
这样的 C++ 函数式函数几乎立即变得难以理解。【参考方案2】:
使用 C++;它具有所有这些的标准和高度优化的版本。绝对没有理由或好处将自己限制在 C 中。
(ed: 换句话说,是的,这是一个非常标准的做法。请记住,在使用 C++ 时,不需要使用 C++ 的任何特性;根据设计,您可以选择。我经常禁用异常,例如,因为它会导致大量臃肿的可执行文件。根本没有理由用 C 编写代码。)
【讨论】:
很多 linux 库都是用 C 编写的,有些人认为它比 C++ 更合适——难道没有理由吗? @7vies:用 C 语言几十年的人,在习惯和历史上挖过沟。 C 是我第一个严肃的语言,但今天我将使用它的唯一地方是:1:在为 C 语言的现有项目做出贡献时,以及 2:如果一个平台只是缺乏 C++ 支持(例如,一些嵌入式系统)。跨度> @Glenn:第二点,太糟糕了 gcc 不能“编译”成 C。 我很确定您仍然可以从 somewhere... 获得 C++ 到 C 的交叉编译器 @Karl:“某处”的问题在于你很少依赖它。以上是关于C 中是不是有一组用于动态字符串、列表和字典的标准库?的主要内容,如果未能解决你的问题,请参考以下文章