标签: Effective

  • 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)的代码

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

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