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

重要结论

  1. SGI STL是最佳学习样本:设计最巧妙、思想最深刻、获得赞誉最盛
  2. Allocator应最先学习:虽然对使用者透明,但理解它是掌握STL工作原理的前提
  3. 迭代器是STL核心:连接容器与算法的纽带,是一种smart pointer
  4. 泛型编程vs面向对象:STL几乎不涉及OO,核心是GP(Generic Programming)
  5. 效率与复用并重:STL在高度复用的同时,对效率做了极致考虑

可行动点

  • 对照源码阅读,使用GNU C++ 2.91版本
  • 下载注释版SGI STL源码:http://www.jjhou.com
  • 实践编写自定义allocator
  • 深入理解rb_tree实现(第5章)
  • 手动画出红黑树插入删除的旋转过程

与其他知识关联


处理信息

  • 处理方法: tesseract OCR预览(528页扫描版PDF,OCR全部处理超时)
  • 笔记基于: 封面、前言、目录、前30页内容提取
  • 待完善: 后续章节的算法实现细节、RB-tree具体操作、hashtable实现等