Effective STL 读后感

这本书的全名叫《Effective STL — 50条有效使用STL的经验》,书其实已经有点历史了,Meyers在2001年时给它写的前言,如今已经2022了。

正如上面所说,因为这本书已经有些年头了,如果你已经是C++11、14、17、20的使用者,可以把第6章函数子、函数子类、函数及其他的内容快速带过看,因为std::functional以及lambda函数已经让C++函数类支持有了显著提升。

简略写一下对我而言有用的一些经验:

第12条:切勿对STL容器的线程安全性有不切实际的依赖
  1. 多线程读是安全的
  2. 多线程对不同容器做写入是安全的
第14条:使用reserve来避免不必要的重新分配

尽管我认为这应该是C++ Engineer的常识了,不过还是有好多小朋友不知道这个点。

第23条:考虑用排序的vector代替关联容器

可以详细看一下。我觉得根本问题是map类的容器对cache不是很友好。连续内存访问总是很香的。

第25条:熟悉非标准的散列容器

写书的时候还没有stl::unordered_map。不过即便放2022年,我也觉得可以看看STL之外的散列容器实现,比如robin-hood-hashing。曾经用过比较坑的一个容器是boost::flat_map,千万别认为它是O(1)的实现。

第31条:了解各种与排序有关的选择

<algorithm>头文件里有很多宝藏,在选择自己实现之前,最好看看STL有没有帮你写好了轮子。

第32条:如果确实需要删除元素,则需要在remove这一类算法之后调用erase

曾经有个说法是std::move does not actually move anything, 对于std::remove也有点类似。

第44条:容器的成员函数优先于同名的算法

如题。

第47条:避免产生“直写型”(write-only)的代码

工程上非常中肯的一条经验。如果没有特殊原因(如及其苛刻的性能要求),尽量不要写出非常难懂的代码,不然几个月乃至几年之后你来调试自己写的代码时也会骂娘。

代码被阅读的次数远远大于它被编写的次数


已发布

分类

,

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据