我对C ++数据结构了解不多,但我想知道你(程序员)使用STL还是编写自己的代码?毕竟STL的目的是通过数据列表执行搜索,替换等任务。
有些人真的不需要了解链表,二进制搜索等等,因为我可以使用STL。你会建议什么?
答案 0 :(得分:116)
您应该使用STL,因为它经过了充分测试和优化。
这并不意味着您不应该自己知道如何编写这些数据结构。凭借这种能力,您将能够为您的应用选择最佳的STL数据结构。
答案 1 :(得分:61)
虽然标准模板库在执行任务时很方便,例如搜索,替换,使用链接列表,但它不应取代图书馆内部内容的知识
您提到不需要了解链接列表,二进制搜索和“更多”,但是您应该至少具备这些数据结构和过程如何工作的工作知识,因为它将使用它们(以及知道何时使用)他们)更有效。
基本上 - 您不必重新发明轮子,但至少知道是什么让车轮有效转动。
答案 2 :(得分:11)
尽可能使用STL和标准库。首先,它可能比您自己的代码更好地测试,其次它有助于保持代码的可移植性。您应该重写任何此功能的唯一时间是出于学习目的。编写自己的关联映射或链表可能很有教育意义,但对于生产代码,请坚持使用经过良好测试和符合标准的代码。
答案 3 :(得分:7)
STL提供的工具的基础数据结构,方法和应用程序的工作知识将使您成为更好的程序员。知道何时使用什么容器类型,或哪种算法与正确的实现一样重要。有时,理解一些更复杂概念的最简单方法是在数据结构和算法类的上下文中自己实现它们。
也就是说,STL中的代码是由专家编写的,并随着时间的推移而改进为一个标准库,用于全世界数百万人。实际上,几乎从来没有理由“推出自己的”,除了性能(或大小)重要的极端情况,这对于您的确切应用至关重要。
答案 4 :(得分:3)
我犹豫不决,因为我在5年内没有写过C ++。但是我想到了一些尚未讨论过的事情。
如果实现不适合您的需要,请不要使用它,如果您可以比使用库更容易编写和测试自己。我最近在Java中遇到过这个问题,我需要一个快速的bitset。详细信息:: JVM中有两个相关的类(BitSet和BigInteger)。 BitSet doesn't support initialization other than by setting one bit at a time; BigInteger有一个无关紧要的问题,让事情变得混乱,并且是不可改变的,在我的案例中这是很昂贵的。我在几个小时内完成了自己的测试。它更适合,更快,我可以做任何我想做的事。
编写自己的另一个原因是,如果您不理解库实现相对于您的要求的规范,无法轻松测试或读取它以弄清楚它的作用,并且可以轻松地自行编写。这是STL实现的一个特殊问题,这些实现是(或者至少曾经)附带简洁,不充分,含糊不清的文档和无评论,不透明的源代码,像巨大的流氓浪潮一样翻滚。
答案 5 :(得分:3)
只是添加我的答案(来自上面的评论):
是的,您应该考虑实施,例如序列,链表,使用您自己的代码。
这是他们在Comp Sci课程上所教授的内容,并不是没有充分理由。但是,如果您希望快速工作,那么只需使用STL。
我认为人们应该了解这些工具是如何运作的。
答案 6 :(得分:2)
通常,您应该使用STL或Boost容器,因为它们的有效性和可靠性。您仍需要在现有容器上拥有相应的世界视图。你应该知道它的优点和优点。研究容器内部结构和工作原理可以让您更好地理解。
答案 7 :(得分:1)
我使用C / C ++标准库和STL,因为它节省了大量时间,我认为不需要重新发明轮子。我也尽可能使用提升。
编写自己的容器类和算法仍然是一个很好的学习练习。
答案 8 :(得分:1)
除非您有令人信服的理由,否则请使用STL,例如:速度或正确性,而不是。绝对知道如何自己编写基本数据结构。
答案 9 :(得分:1)
STL经过良好测试且可靠,但它不是最快的解决方案。一些容器分配了许多小内存块而不是一个大块。如果您确实遇到速度问题,那么您可以考虑制作自己的固定大小列表。但出于多种目的,STL是标准解决方案。
答案 10 :(得分:1)
非常聪明的人写了STL。然后更聪明的人使用它,测试它并改进它。你认为你会做得更好吗?很少。这是一个很棒的工具;你应该尽可能使用它!
答案 11 :(得分:1)
在学习/玩耍时自己编写低级别的东西,但在工作中使用多年来由专家编写和完善的代码,并且已经/正在由数千名工程师在数千种不同条件下进行测试。
换句话说,只有当您的代码能够胜过其他代码时才会使用您的代码!