C++ / a working model

BOOK / SOURCE & READING RECORD

Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library

Scott Meyers

English first edition, 2001; full Chinese edition read: 清华大学出版社2006年4月第1版第1次印刷,潘爱民、陈铭、邹开红译,ISBN7-302-12695-X;另读2011英文电子版出版社样章

READING EVIDENCE / 已读完整正文

Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library

已读完222页中文扫描本的全部实质内容:引言、Items1–50、参考书目、附录A/B(印刷页1–208,PDF15–222)。PDF1–99读取远程OCR全文,另直接核对21、38、70–71页图示;服务限流后不再请求OCR,PDF100–222逐页直接读图,包括全部代码、表格和插图。版权页核实2006年4月中文第1版第1次印刷。另读英文出版社Items1–4、16、21、44;不把中文全书通读说成英文全书通读。

查看版本、实际阅读范围与原文入口 →

Sources

容器的等价关系是业务契约的一部分

中文版Items19–21,印刷67–77;Items44–45,160–169;另核对英文出版社Items21、44

Item 21 与44合在一起看,可以发现查找并不只是速度选择:有序容器判断两个键是否等价,要看比较器是否认为任何一方排在另一方之前;普通 find 则依赖等号。若业务选择按编号分组,两个附带标签不同的对象可以在集合里等价,却不一定按对象等号相等。因此迁移查找方式必须先保留身份定义,再讨论复杂度。比较器反向排序应交换参数,不能直接否定原结果。历史版本把 hashed containers 称为非标准,也讨论非恒定时间 list::size;C++20 已有 unordered 容器且 list::size 为常数复杂度,不能原样推广这些旧结论。

把长期契约与时代限制分开阅读

中文版Items14、28、30、32、36、39,印刷53–55、101–103、106–110、115–118、128–130、139–142;附录A/B,195–208

全书值得迁移到今天的是边界意识:reserve提供容量而不创建元素,remove压紧保留区间而不缩小容器,反向迭代器的base指向相邻正向位置,状态化判别式不能依靠算法只保留一份对象。这些都是可检验的契约。另一方面,书中没有copy_if、关联容器erase不返回迭代器、分配器不可携带状态以及string可以写时复制等背景已经变化;应分别用标准copy_if、erase返回位置、allocator_traits及现代字符串规则重新审视。附录A更提醒我,不区分大小写不是把字节机械转小写:语言、区域与排序规则必须成为接口约定。附录B针对MSVC4–6的替代库建议只属于历史材料。

相关基础课

map 与 set:有序关联和比较器契约算法:sort、边界查找与 erase-remove迭代器:能力类别、范围与有效性vector:增长、容量与失效规则

原创实践 →