STL 源码剖析
作者: 侯捷(译著)
出版社: 华中科技大学出版社
原版: The Annotated STL Sources (using SGI STL)
页码: 528页
文件大小: 11.34MB
核心观点
本书是C++程序员深入理解STL(Standard Template Library)实现细节的经典之作。侯捷以SGI STL 2.91.57版本为剖析对象,从源码层面揭示了STL六大组件的设计思想和实现技巧。
核心定位:
- 不适合STL初学者(需已有基本运用经验)
- 不是面向对象(OO)技术书籍
- 聚焦泛型编程(Generic Programming)和底层实现
- “源码之前,了无秘密”——透过源码揭示大师思维
关键概念
一、STL六大组件
| 组件 | 职责 | 对应头文件 |
|---|---|---|
| 空间配置器 (allocator) | 内存管理,第一级/第二级配置器 | <allocator> |
| 迭代器 (iterator) | 容器与算法之间的”胶合剂”,smart pointer | <iterator> |
| 序列式容器 (sequence containers) | vector, list, deque, stack, queue, heap, priority_queue, slist | <vector>, <list>, <deque> |
| 关联式容器 (associative containers) | set, map, multiset, multimap | <set>, <map> |
| 算法 (algorithms) | sort, search, copy, erase等非变异/变异算法 | <algorithm>, <numeric> |
| 仿函数 (functors) | 函数对象,策略化编程 | <functional> |
二、Traits编程技法
STL源代码的门钥:通过trait萃取迭代器的相应型别(value_type, difference_type, reference_type, pointer_type, iterator_category),实现算法的overload解析。
// traits萃取iterator_category示例
template <class Iterator>
typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&);三、空间配置器层级
第一级配置器 (malloc_alloc_template):
- 直接使用malloc/free
- 处理内存不足时尝试分配handler
- 线程不安全,无alignment考虑
第二级配置器 (default_alloc_template):
- 采用memory pool,减少malloc/free开销
- 空闲链表管理16种自由列表(free list)
- 每次请求大于128字节委托第一级
- 线程安全需外部同步
四、红黑树(RB-tree)
STL关联容器底层实现:
- 自平衡二叉查找树
- 节点颜色:红色/黑色
- 插入删除后通过旋转和重着色保持平衡
- O(log n)查找、插入、删除
五、哈希表(hashtable)
STL非标准扩展:
- 开链法(separate chaining)实现
- bucket数组 + 链式节点
- 自动rehash扩容
- 支持hash_set, hash_map, hash_multiset, hash_multimap
重要结论
- SGI STL是最佳学习样本:设计最巧妙、思想最深刻、获得赞誉最盛
- Allocator应最先学习:虽然对使用者透明,但理解它是掌握STL工作原理的前提
- 迭代器是STL核心:连接容器与算法的纽带,是一种smart pointer
- 泛型编程vs面向对象:STL几乎不涉及OO,核心是GP(Generic Programming)
- 效率与复用并重:STL在高度复用的同时,对效率做了极致考虑
可行动点
- 对照源码阅读,使用GNU C++ 2.91版本
- 下载注释版SGI STL源码:http://www.jjhou.com
- 实践编写自定义allocator
- 深入理解rb_tree实现(第5章)
- 手动画出红黑树插入删除的旋转过程
与其他知识关联
- Effective C++ - 配合阅读,理解STL使用规范
- Effective STL - 55条使用准则,深化STL应用
- 泛型思维 - 侯捷另一著作,补充泛型编程理论
- 多态与虚拟 - OOP基础,与STL的GP形成对比
处理信息
- 处理方法: tesseract OCR预览(528页扫描版PDF,OCR全部处理超时)
- 笔记基于: 封面、前言、目录、前30页内容提取
- 待完善: 后续章节的算法实现细节、RB-tree具体操作、hashtable实现等