gpt4 book ai didi

c++ - 好主意/坏主意我应该重新实现大部分 C++ 吗?

转载 作者:可可西里 更新时间:2023-11-01 15:28:53 27 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

3年前关闭。




Improve this question




最近,我在阅读 this 后想到了一个危险的想法博客文章。这个想法可以这样表达:

我不需要 C++ 标准库提供的大部分内容。那么,为什么我不实现一个不太通用但更易于使用的版本呢?

例如,使用 STL 会产生大量难以理解和错误的编译器错误。但是,我不关心分配器、迭代器等。例如,为什么我不花几个小时来实现一个易于使用的链表类呢?

我想从 StackOverflow 社区知道的是:对于 C++ 中的大多数现有功能,“滚动我自己的”有什么危险、可能的缺点和可能的优点?

编辑:我觉得人们对这个想法误解了我。这个想法是为了了解我是否可以实现 非常一小组被大大简化的 STL 功能——更像是一个教我数据结构等的项目。我不建议从头开始重新发明整个轮子,只是我需要并想了解的部分。 我想我想弄清楚的是,使用 STL 的复杂性是否值得创建更小、更简单的版本。

重用 boost 或类似的。

我编写的大部分代码都是为大学编写的,我们不允许使用外部库。所以它要么是 C++ 标准库,要么是我自己的类。

这个问题的客观性。

这个问题是不是 主观。也不应该是社区 Wiki,因为它不是民意调查。我想要具体的论据来突出可能 的一项优势或一项劣势。可能 发生在我的方法中。与流行的看法相反,这不是意见,而是基于经验或良好的逻辑论证。

格式。

请只发布一个缺点 每个答案都有一个优势。这将允许人们一次评估单个想法而不是您的所有想法。

还有请...

没有宗教 war 。我不是任何语言的粉丝。我使用任何适用的。对于似乎是 C++ 的图形和数据压缩(我目前正在做的工作)。请限制您对问题的回答,否则他们将被否决。

最佳答案

So, why don't I implement a less general, but easier to use version?



因为你不能。因为不管你对 C++ 怎么说,它都不是一种简单的语言,如果你还不是很擅长它,你的链表实现就会有问题。

老实说,您的选择很简单:

学习 C++,或者不使用它。是的,C++ 通常用于图形,但 Java 也有 OpenGL 库。 C#、Python 和几乎所有其他语言也是如此。或 C。您不必使用 C++。

但是,如果您确实使用它,请学习它并正确使用它。

如果您想要不可变的字符串,请将您的字符串创建为 const。

无论其底层实现如何,STL 的使用都非常简单。

C++ 编译器错误可以读取,但需要一些练习。但更重要的是,它们并不是 STL 代码独有的。无论您做什么,使用哪些库,您都会遇到它们。所以习惯他们。如果您已经习惯了它们,那么您也可以使用 STL。

除此之外,还有一些其他的缺点:
  • 没有其他人会理解您的代码。如果您在 SO 上提出有关 std::vector 或双向迭代器的问题,那么熟悉 C++ 的每个人都可以回答。如果您询问 My::CustomLinkedList,没有人可以帮助您。这是不幸的,因为滚动你自己的也意味着会有更多的错误需要帮助。
  • 你试图治愈症状,而不是原因。问题是你不懂C++。 STL 只是一种症状。避免 STL 不会神奇地使您的 C++ 代码运行得更好。
  • 编译器错误。是的,它们读起来很讨厌,但它们就在那里。 STL 中的大量工作已用于确保在大多数情况下错误使用会触发编译器错误。在 C++ 中,编写可编译但不起作用的代码非常容易。或者似乎有效。或者在我的电脑上工作,但在其他地方神秘地失败了。您自己的链表几乎肯定会将更多错误移动到运行时,在那里它们会在一段时间内未被发现,并且更难追踪。
  • 再一次,这将是马车。相信我。我见过该死的优秀 C++ 程序员在 C++ 中编写一个链表只是为了在模糊的边界情况下发现一个接一个的错误。而 C++ 都是边界情况。你的链表会正确处理异常安全吗?如果创建一个新节点(从而调用对象类型的构造函数)抛出异常,它会保证一切都处于一致状态吗?它不会泄漏内存,所有适当的析构函数都会被调用?它会是类型安全的吗?它会如此高效吗?用 C++ 编写容器类时有很多令人头疼的问题。
  • 您错过了现有的任何语言中最强大、最灵活的库之一。 STL 可以做很多事情,即使使用 Java 庞大而臃肿的类库也会很痛苦。 C++ 已经足够难了,不需要抛弃它提供的一些优势。

  • I don't care about allocators, iterators and the like



    可以安全地忽略分配器。你甚至不需要知道它们的存在。迭代器虽然很棒,但弄清楚它们会为您省去很多麻烦。要有效地使用 STL,您只需要了解三个概念:
  • 容器:你已经知道这些了。 vector 、链表、映射、集合、队列等。
  • 迭代器:使您可以导航容器(或容器的子集,或任何其他值序列,在内存中,以流的形式在磁盘上,或动态计算)的抽象。
  • 算法:适用于任何一对迭代器的通用算法。您有排序、for_each、查找、复制和许多其他功能。

  • 是的,与 Java 的库相比,STL 很小,但是当您结合上述 3 个概念时,它包含了惊人的力量。有一点学习曲线,因为它是一个不寻常的图书馆。但是,如果您打算花一两天以上的时间使用 C++,那么值得好好学习。

    不,我没有遵循您的答案格式,因为我认为实际上给您一个详细的答案会更有帮助。 ;)

    编辑:

    很容易说,滚动自己的一个优势是你可以学习更多的语言,甚至可能为什么 STL 是它的可取之处之一......但我并不真正相信这是真的。它可能有效,但也可能适得其反。

    正如我上面所说,编写似乎有效的 C++ 代码很容易。当它停止工作时,很容易重新安排一些事情,比如变量的声明顺序,或者在类中插入一些填充,使其看起来再次工作。你会从中学到什么?这会教你如何编写更好的 C++ 吗?也许。但最有可能的是,它只会教你“C++ 很烂”。它会教你如何使用STL吗?当然不。
    一种更有用的方法可能是利用 StackOverflow 的强大功能以正确的方式学习 STL。 :)

    关于c++ - 好主意/坏主意我应该重新实现大部分 C++ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637986/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com