那么,为什么我不实现一个不太通用但更易于使用的版本呢?
因为你做不到。因为不管你对 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++ 编写容器类时,有很多令人头疼的问题需要处理。
- 您错过了使用任何语言的现有最强大和最灵活的库之一。即使使用 Java 庞大的类库,STL 也可以做很多令人痛苦的事情。C++ 已经够难了,没有必要放弃它提供的一些优势。
我不关心分配器、迭代器等
可以安全地忽略分配器。你几乎不需要知道它们的存在。迭代器虽然很棒,但弄清楚它们会为您省去很多麻烦。要有效地使用 STL,您只需要了解三个概念:
- 容器:你已经知道这些了。向量、链表、映射、集合、队列等。
- 迭代器:允许您导航容器(或容器的子集,或任何其他值序列,在内存中,以流的形式在磁盘上,或在运行中计算)的抽象。
- 算法:适用于任何一对迭代器的常用算法。您有 sort、for_each、find、copy 和许多其他功能。
是的,与 Java 的库相比,STL 很小,但是当您结合上述 3 个概念时,它的强大功能令人惊讶。有一点学习曲线,因为它是一个不寻常的库。但是,如果您要花一两天以上的时间使用 C++,那么值得好好学习。
不,我没有遵循你的答案格式,因为我认为实际上给你一个详细的答案会更有帮助。;)
编辑:
很有可能会说滚动自己的优势是您可以学习更多的语言,甚至可能为什么 STL 是它的可取之处之一。但我并不真正相信这是真的。它可能有效,但也可能适得其反。
正如我上面所说,编写似乎可以工作的 C++ 代码很容易。当它停止工作时,很容易重新安排一些事情,比如变量的声明顺序,或者在类中插入一些填充,使其看起来再次工作。你会从中学到什么?那会教你如何编写更好的 C++ 吗?也许。但最有可能的是,它只会告诉你“C++ 很烂”。它会教你如何使用 STL 吗?当然不。一种更有用的方法可能是利用 StackOverflow 的强大功能以正确的方式学习 STL。:)