使用 C 或 C++ 的数据结构?

Posted

技术标签:

【中文标题】使用 C 或 C++ 的数据结构?【英文标题】:Data Structures using C or C++? 【发布时间】:2010-06-09 13:03:29 【问题描述】:

使用基于 C++ 的类/对象与使用传统 C 结构管理标准数据结构(如链表、堆栈、树、队列等)相比有哪些优势?如果问题不清楚,请告诉我。

【问题讨论】:

这取决于数据使用情况。你能进一步解释一下吗? 您似乎在问为什么要使用类而不是传统的 C 结构?是的,你的问题不清楚。 【参考方案1】:

一方面,在 C++ 中,您可以使用模板,它允许您创建泛型集合并以类型安全的方式使用它们。 IE。您可以拥有一个字符串列表、另一个整数列表和三分之一的 YourClass 对象,所有这些都由单个列表实现支持,并且编译器保证您不能将字符串放入整数列表中。

在 C 语言中,您只能通过 void* 指针来实现这一点,编译器无法保证类型安全。

【讨论】:

虽然不是类型安全的,但您可以通过使用指向 void 的指针在 C 中获得 C++ 模板必须提供的所有优点(减去硬的东西)。 性能也会受到影响 - 考虑到 std::deque<T> 可以存储其成员大部分是连续的,但基于 void* 的解决方案不会。 @ardsrk,当然你也可以在 C 中实现类似的东西——通常需要更多的努力、更多的代码和更糟糕的结果。 STL 实现已经过十多年的测试和微调。 您可以将元素(例如使用memcpy)复制到连续的缓冲区中,以在C语言中获得相同的结果。 @ardsrk:您假设编写这些 C 应用程序的人实际上有选择权。他们可以使用高质量的 C++ 编译器,他们拥有必要的 C++ 技能,等等。这是一个荒谬的论点。如果你不能说为什么 C 会比 C++ 更快,不要试图通过说“是的,但是很多高性能应用程序都是用 C 编写的,所以它必须是最快的,对吧?”当面对关于为什么模板解决方案比 void* 更快的事实论据时,如果您不同意,您将需要事实论据。【参考方案2】:

C++ 数据结构是由 STL 提供的(无论如何,你的 OP 中的所有数据结构)。您可以立即在任何 C++ 编译器中为自己创建一个 std::map。在 C 中,您必须自己编写。此外,STL 提供了许多保证,例如强类型安全、没有内存泄漏,并且通常比自制的替代方案更快。此外,在 C++ 中,您可以编写模板化函数来获取几乎任何 STL 数据结构,并对其进行迭代。

基本上,C++ 会为您自动完成大量工作,并保证它可以正常工作。 C 解决方案没有任何优势。

【讨论】:

【参考方案3】:

一大优势是它为您提供性能保证。此外,代码更易于维护,因为它是标准化的,任何加入团队的新成员都将能够快速理解代码。

【讨论】:

【参考方案4】:

C++/OO 数据结构的优点:

使用操作结构的方法对数据结构进行自然分组。

处理数据结构的方法/函数更自然的名称:例如push()pop() 而不是一些人为的命名空间嵌入函数名称。

编译器检查的数据结构保护。

继承 - 处理任何可迭代的序列。

【讨论】:

【参考方案5】:

主要优点是方法(代码)与数据在一起。

c 风格:

linkedlist_append(linkedlist* list, void* element)

现在比较:

class LinkedList

   LinkedList* Append(void* element);

甚至

   LinkedList* Append(T* element);

【讨论】:

【参考方案6】:

虽然您可以仅使用 C 来添加自定义方法,但这相当难看,而 C++ 提供了一种更优雅、更自然的方式。 在 C++ 中,您可以使用多态性并将基类添加到您的结构中。在您的示例中,所有数据结构都可能支持 add() 和 find() 方法。因此,您可以编写独立于底层数据结构的代码 - 如果需要,您可以稍后更改实现甚至使用的数据结构。 此外,例如堆栈可以定义为特殊列表,因此您可以将列表扩展为堆栈(或队列),从而减少代码中的冗余。

此外,C++ 已经在标准库中提供了最有用的数据结构,这些数据结构写得很好,基于模板,因此是通用的,并且在任何地方都相同,因此可移植。

【讨论】:

【参考方案7】:

当我们使用结构时,所有元素都保存在堆栈中,但是当我们使用类时,所有元素都存储在堆中。堆的大小大于堆栈的大小。堆是引用类型,而堆栈是值类型。所以如果我们有很多无法通过结构管理的数据,我们总是更喜欢类。

【讨论】:

以上是关于使用 C 或 C++ 的数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

在 C 或 C++ 中定义结构的宏

用c或c++实现结构体的序列化和反序列化

C++ stl 集合或链表

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。

从 C++ 如何执行 C 中的方法或访问结构?

用C或C++编程实现数据库的查询,添加,删除,修改功能。