BOOK / SOURCE & READING RECORD
The C++ Standard Library: A Tutorial and Reference
Nicolai M. Josuttis
2nd edition, first printing March 2012, ISBN 9780321623218;另读third printing July2013样章及2012补充章
The C++ Standard Library: A Tutorial and Reference
已逐段通读英文第2版第1—19章全部正文(pp.1—1030),参考文献及补充章S.1—S.3(pp.1103—1161);主文本L635—44987、补充正文L48029—50769已读。随后直接核读51个图题所在PDF页和6个概率公式/上下文页,包含所有已定位图示及§17.1.5二维公式。full指正文与这些实质图示读完,不表示逐页校勘全部PDF;索引仅导航抽查,未逐条读。
查看版本、实际阅读范围与原文入口 →阅读原创实践:chrono 单位:别把 1500 毫秒变成 1 毫秒 →
chrono 单位:别把 1500 毫秒变成 1 毫秒
已读材料说明标准库的价值不只是减少代码量,而是替接口携带约束:duration 记录单位,bitset 记录位数,allocator 区分取得存储和构造对象。时间转换最容易在 count() 被取出时失去语义,所以练习不测真实时钟速度,只验证同一预算在不同表示下的对应关系与截断余量。补充章的 valarray 子集是代理对象,不能误当成独立容器;其分配器章节同时含 C++98 与 C++11 模式,也不能不加区分地移植到 C++20。现代读法应该保留“类型表达单位和责任”的原则,另查当前接口,而不是把旧版本的签名表当作永远有效的规范。
阅读定位:§5.6—§5.7,pp.140—160;Supplementary Chapter S.1—S.3,pp.1103—1161
容器—算法分离把容量与边界责任留给调用者
STL把存储结构与处理策略分开,迭代器是二者的协议。这使算法能处理子区间、数组和输入流,也意味着算法并不知道容器如何扩容:copy写到普通迭代器是覆盖已有元素,back_inserter才把赋值转成追加;reserve并不创建可覆盖元素。remove返回新的逻辑终点,不会替容器删除对象。关联容器的键更不能通过普通修改算法改变,否则比较或哈希不变量就失去基础。泛型并不意味着完全不看结构:list成员remove可重连节点,泛型remove却搬动值。现代ranges让边界表达更直接,C++20 erase_if能缩短常见删除,但这些便利不会消除迭代器失效和借用寿命。
阅读定位:§6.3—6.7,pp.188—223;§6.11—6.13,pp.244—251
函数对象可以有配置,但判定不能依赖偶然调用历史
谓词最重要的性质不是写成函数、类还是lambda,而是相同输入在所需范围内保持一致的判断。按值捕获阈值形成稳定配置完全合理;用内部计数决定“第几个元素算匹配”却可能被算法复制谓词、选择不同遍历策略而破坏。for_each返回操作对象可以承载特定汇总语义,但不能把这项保证推广到所有算法。书中嵌套bind展示组合能力,今天通常用lambda更容易看出实参和生命周期;没有证据时也不能把“函数对象常便于内联”说成绝对更快。书中无捕获lambda不可默认构造等限制属于C++11,C++20已变化;带引用捕获的闭包则始终需要额外证明被引用对象仍存活。
阅读定位:§3.1.10;§6.8—6.10,pp.28—32、224—243
失效规则要分别说明对象地址和遍历位置
容器改变结构后,迭代器、引用与指针不一定同时失效。unordered容器rehash改变遍历结构却保留元素引用,deque端部插入也不能用一句“所有句柄都稳定”概括;vector未重分配仍可能使插入点及之后的旧句柄失效。swap通常让句柄随元素进入另一容器,array却交换固定位置的值。选容器应先写出需要保持哪些关系,再比较复杂度和局部性。哈希表还要求等价键拥有相同哈希;不满足是契约错误,而不只是性能较差。C++17节点句柄允许取出后改键再插入,但不意味着可以绕过容器原地修改有序键。
阅读定位:§7.1.2、§7.2.1、§7.3.2、§7.4.2、§7.9.2—7.9.3、§8.4、§8.9.2,pp.258—263、275—276、286、363—373、407—408、428—429
流、字符与任务都需要保留各自的状态边界
输入流把错误位保留下来,所以clear只清状态,不会消费造成失败的字符;自定义解析应先读入临时值,验证成功才提交对象。streambuf负责字符传输,ostream负责格式与状态,直接走缓冲区的优化也会绕过部分语义。locale又与char_traits不同:前者组合运行期文化规则,后者定义字符类型操作,二者都不是通用Unicode处理器。并发任务同样不能只看值:future还承载完成与异常,async默认可以延迟执行,锁保护共享不变量,条件变量等待谓词。把这些层次压成“一个方便API”会丢失恢复与寿命信息。C++20有更多工具,但没有取消这些接口责任。
阅读定位:§15.4、§15.11—15.14;§16.1—16.4;§18.1—18.7,pp.758—766、812—848、850—906、945—1022
原文与实际阅读范围
- 作者书页
确认C++11第二版及代码资源
- 出版社样章
§5.6—§5.7;目录和索引不计正文
- 完整开放补充章
S.1—S.3,pp.1103—1161;不是主书全文
- 出版社购买页
完整电子版需购买,未绕过
公开可读第二版全文(私有研究来源,非授权转载声明)
英文第一次印刷March2012,19章正文及补充章全部读完;另核读51个图题页和6个公式/上下文页,与作者补充章分开记账
研究副本不在本站公开链接。
原书版权页保留所有权利;公开仓库可访问不等于上传者获授权,也不等于本站获得转载许可。PDF及提取文本仅保留在私有研究目录;本站只发布原创中文综合讲解、原创程序及来源链接,不托管书籍副本。
能下载不等于已经读完;试读章节不等于全书。这里的原创笔记不是原书全文、译本或逐章替代品。
相关基础知识
相关主题链接用于补充背景,不表示这些既有文章已经按整本书核查。