作为一名C++开发者,必须掌握STL的哪些知识?

4

我很了解C ++,但从未深入学习STL。在我的工作中,我必须学习STL的哪些部分以提高生产力并减少缺陷?

谢谢。

5个回答

10

我对C++有很好的了解。

恕我直言,但不是这样的——你并没有。标准库,或者至少其中的大部分(特别是被称为“STL”的子集)是C++的基本组成部分。如果没有它的知识,那么你对C++的了解实际上并不多。

事实上,自98版以来,C++的许多现代设计(基本上是一切)都是根据标准库的设计考虑而指导的,而自那时以来语言中的许多更改都是对标准库的更改。如果你看一下官方的C++语言描述,其中很大一部分都与库有关。


4
通常,对于那些从未使用过STL的人来说,第一反应(当然这只是我的观点)就是对所有模板代码感到不满。因此,我建议先学习一些关于这个主题的基础知识。
如果您已经了解了模板基础知识,我会建议您简要查看一下STL设计文档。实际上,对于尚未熟悉STL的人来说,这是第二个麻烦。原因是STL不是根据典型的面向对象范例设计的,而是根据泛型编程范例设计的。
有了这个理解,一个好的开始可能是这篇入门文章。其中解释了STL组件中使用的术语。请注意,这是一篇相对较旧的文本,重点是SGI实现(早于C++标准),并且错误地将哈希式容器视为其中的一部分。然而,理论仍然有效。
如果您已经了解了我到目前为止所说的大部分内容,可以直接跳转到其他提供的主题。

2
您提到要提高生产力并减少缺陷。您可以使用一般性的指导方针来实现这一点。我假设您使用c++11,并且我提到了比stl(智能指针)更多的内容:
  1. 使用容器,它们将为您管理内存。例如,您可以摆脱C数组中的new和后续的delete。对于动态数组,请使用std::vector。您还可以使用std::unordered_map中的哈希表和std::map中的平衡树。还有更多的容器,请看这里
  2. 尽可能使用std::array而不是普通的C数组:当作为函数参数传递时,它们永远不会退化为指针,这可以避免非常恶心的错误。
  3. 使用智能指针,永远不要在代码中使用裸new和其匹配的delete。这可以比您预期的减少错误,特别是在异常存在的情况下。
  4. 尽可能使用std::make_shared。您可以将其用于直接分配一个shared_ptr作为一个函数的参数,该函数需要一个std::shared_ptr。使用裸new是不可能的。
  5. 使用算法而不是手写循环。代码将更易读,并且通常更具性能。
有了这些建议,您的代码应该更接近(但不一定等同或语义相等)于C#或Java,其中手动内存管理消失了。在许多情况下,这比垃圾收集甚至更好,因为您可以确定资源何时被释放。

0

我认为来自<algorithm>算法将真正清理您的代码,同时使您的代码更简洁。

显然,对所有容器的知识将帮助您优化由某个不可避免而又不太理想的容器选择引起的代码瓶颈(但务必先进行分析)。

这些基础知识非常重要,它们将大大帮助您编写更加健壮的代码。

之后,您可以深入研究像std::shared_ptr这样的智能指针,它们几乎总是比常规指针更好(至少在我的情况下是这样)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接