C++ STL Engineering Roadmap
From STL API Use to Source-Level Containers, Algorithms, and Engineering Judgment
Part 1: C++ Low-Level Foundations
Chapter 1: C++ Object Model
- 1.1 对象身份、存储期与有效对象(整理对象如何占据存储、拥有类型和进入有效生命周期)
- 1.2 对齐、padding 与 sizeof(归纳 alignment、padding、空类大小和成员布局如何共同决定对象大小)
- 1.3 栈对象、堆对象与所有权入口(说明自动存储、动态存储和 STL 容器持有元素时的责任边界)
- 1.4 this 指针、成员函数与对象状态(说明成员函数如何通过 this 操作对象状态,以及函数实体与实例存储的关系)
- 1.5 虚函数表与多态对象布局(整理虚函数表、动态派发和对象布局变化对资源管理的影响)
- 1.6 对象模型对 STL 实现的约束(提炼对象布局、构造析构和类型语义如何影响容器、allocator 和 iterator)
Chapter 2: Object Lifetime
- 2.1 生命周期起点:存储、构造与有效对象(追踪对象从原始存储到有效对象的必要条件)
- 2.2 构造函数家族:默认、拷贝与移动(整理三类构造函数各自建立的初始状态和资源关系)
- 2.3 赋值函数家族:拷贝赋值与移动赋值(说明已有对象被重新赋值时的旧资源处理、新状态建立和自赋值边界)
- 2.4 临时对象、生命周期延长与引用边界(整理临时对象进入表达式、绑定引用和结束生命周期的判断规则)
- 2.5 析构、销毁顺序与 RAII(说明析构函数如何封闭资源责任,并提炼对象销毁顺序的工程后果)
- 2.6 容器元素生命周期与 STL 管理路径(追踪 STL 容器如何通过 allocator、placement new 和 destroy 管理元素生命周期)
Chapter 3: Move Semantics and Rvalue References
- 3.1 value category:lvalue、rvalue 与表达式身份(给出表达式类别如何决定引用绑定、重载选择和对象可搬移性)
- 3.2 左值引用、右值引用与引用绑定(整理引用类型、被绑定对象和生命周期之间的边界)
- 3.3 std::move 与 moved-from 状态(说明 std::move 只改变表达式类别,并提炼 moved-from 对象的可用状态)
- 3.4 forwarding reference、引用折叠与 std::forward(追踪完美转发如何保留实参类别并进入模板调用路径)
- 3.5 move constructor、move assignment 与 noexcept(整理移动构造、移动赋值、noexcept 和 move_if_noexcept 的选择规则)
- 3.6 move 语义对 STL 容器扩容的影响(追踪 vector 等容器扩容时 move、copy、异常安全和元素状态的关系)
Chapter 4: Memory Management
- 4.1 分配接口:malloc / free 与 operator new / delete(给出 C 分配接口和 C++ 分配函数在对象模型中的责任边界)
- 4.2 new / delete expression 的组合动作(说明表达式如何把内存分配、构造、析构和释放串成完整路径)
- 4.3 placement new、raw memory 与 uninitialized memory(整理未初始化存储上创建对象、销毁对象和恢复原始存储的规则)
- 4.4 对齐、cache locality 与内存碎片(说明内存布局如何影响访问成本、空间浪费和容器性能)
- 4.5 内存池与 allocator 策略入口(整理池化分配如何改变分配次数、碎片和对象构造责任)
- 4.6 STL 容器的内存管理路径(追踪容器如何在分配、构造、移动、销毁和释放之间保持对象状态)
Chapter 5: Template Foundations
- 5.1 函数模板、类模板与实例化时机(整理模板定义、使用点实例化和错误暴露之间的关系)
- 5.2 模板参数推导与非类型模板参数(说明模板实参如何从调用、类型和值中进入编译期计算)
- 5.3 variadic templates、特化与偏特化(整理可变参数模板和特化机制如何表达泛型分支)
- 5.4 typename、dependent name 与二阶段查找(说明依赖名为何需要显式标注,以及查找失败如何出现)
- 5.5 constexpr、inline 与编译期边界(归纳编译期求值、ODR 和头文件实现对模板库的影响)
- 5.6 模板机制对 STL 泛型设计的支撑(提炼模板如何支撑 iterator、traits、allocator、algorithm 和容器抽象)
Part 2: STL Core Mechanisms
Chapter 6: Iterator System
- 6.1 iterator 作为 range cursor(说明 iterator 如何把容器内部结构转成算法可消费的位置接口)
- 6.2 pointer、iterator category 与能力分层(整理 pointer、input、output、forward、bidirectional、random access 和 contiguous iterator 的能力边界)
- 6.3 iterator_traits 与 tag dispatch(说明算法如何从 iterator 类型中提取能力并选择实现路径)
- 6.4 标准 iterator adapter(整理 reverse、insert、back/front insert 和 stream iterator 的适配方式)
- 6.5 iterator 失效与算法解耦(提炼容器修改、位置对象失效和算法独立性的工程判断)
- 6.6 mini iterator 与 mini reverse_iterator 实现路径(把最小 iterator 实现整理成类型、状态、运算和边界检查)
Chapter 7: Allocator System
- 7.1 allocator 作为容器内存策略(说明 allocator 为何把容器逻辑和内存来源分开)
- 7.2 allocate、deallocate、construct 与 destroy(追踪 allocator 如何分别处理原始存储和对象生命周期)
- 7.3 allocator_traits、rebind 与 propagation(整理 traits 如何统一 allocator 接口并影响容器拷贝、移动和交换)
- 7.4 raw memory algorithm 与 uninitialized 操作(说明 uninitialized_copy、uninitialized_move、uninitialized_fill 和 destroy 如何服务容器批量构造)
- 7.5 pool allocator、polymorphic allocator 与 std::pmr(整理分配策略多态化对性能、碎片和对象所有权的影响)
- 7.6 allocator 对容器实现与 mini allocator 的影响(提炼 allocator 在 vector、list、map 和最小实现中的检查点)
Chapter 8: Generic Algorithm Design
- 8.1 算法独立于容器的接口条件(说明 half-open range、iterator 和 value type 如何形成算法输入契约)
- 8.2 iterator + algorithm 的解耦路径(追踪算法如何只依赖迭代器能力而访问不同容器)
- 8.3 traits、tag dispatch 与 policy based design(整理编译期信息和策略分发如何进入算法实现)
- 8.4 函数对象、谓词与用户可插入行为(说明算法如何把比较、筛选和变换逻辑留给调用者注入)
- 8.5 algorithm 适配不同 iterator 的设计边界(提炼 STL 算法能泛化到哪里,以及复杂度和语义承诺的边界)
Chapter 9: Exception Safety
- 9.1 basic、strong 与 no-throw guarantee(整理三种异常安全承诺各自保证的对象状态)
- 9.2 noexcept 与 move_if_noexcept 的选择规则(说明 noexcept 如何影响 STL 在移动和拷贝之间选择)
- 9.3 RAII、commit / rollback 与资源恢复(追踪异常路径上资源如何被自动释放或回滚)
- 9.4 vector 扩容中的异常安全路径(说明分配、构造、移动、提交和回滚如何共同保护旧状态)
- 9.5 allocator 与容器插入失败恢复(整理 allocator 参与时失败点、清理责任和状态承诺)
- 9.6 STL 源码中的异常安全设计信号(提炼源码中临时缓冲、guard、scope cleanup 和提交点的识别方法)
Part 3: Sequence Containers
Chapter 10: Vector
- 10.1 vector 的连续存储模型与三指针状态(整理动态数组、连续内存、begin / end / capacity 和 size / capacity 的状态关系)
- 10.2 reserve、resize 与 shrink_to_fit 的状态改变(说明容量管理 API 如何改变存储、元素生命周期和复杂度)
- 10.3 push_back、emplace_back、insert、erase 与 clear(追踪常用修改操作如何构造、移动、销毁元素并更新迭代器)
- 10.4 reallocate 路径:allocator、placement new、move / copy 与 move_if_noexcept(整理扩容时内存分配、元素迁移、异常安全和提交点)
- 10.5 iterator 失效、cache locality 与性能陷阱(提炼连续内存带来的性能收益、失效规则和常见误判)
- 10.6
vector<bool>Specialization Boundary and Mini Vector Checkpoint(说明特化边界、选型判断和最小 vector 实现检查点)
Chapter 11: Array
- 11.1 std::array 的固定大小对象模型(说明固定大小、栈上存储和对象语义如何决定 array 的边界)
- 11.2 aggregate initialization 与 constexpr 支持(整理初始化方式和编译期使用条件)
- 11.3 iterator 支持与 STL 集成(说明 array 如何用普通范围接口进入算法体系)
- 11.4 与 C 数组、vector 的判别维度(给出所有权、大小可变性、退化行为和接口能力的对比结论)
- 11.5 工程使用场景(提炼 array 适合表达固定容量数据和局部对象布局的判断方法)
Chapter 12: Deque
- 12.1 双端队列语义与分段连续内存(说明 deque 为何能同时服务两端增长和随机访问)
- 12.2 map 控制结构、block / buffer 与 iterator 状态(整理 deque 内部索引、分段定位和 iterator 复杂度来源)
- 12.3 push_front、push_back、pop_front 与 pop_back(追踪两端操作如何改变边界块、元素状态和复杂度)
- 12.4 扩容方式、allocator 参与与 O(1) 随机访问(说明分段扩容如何维持随机访问承诺并改变内存管理路径)
- 12.5 iterator 失效、cache locality 与容器对比(提炼 deque 相对 vector、list 的性能和失效判断)
- 12.6 deque 复杂度来源与 mini deque 实现(把最小 deque 实现整理成控制数组、块、迭代器和边界操作)
Chapter 13: List
- 13.1 双向链表、节点结构与 prev / next 指针(整理 list 的对象布局和双向链接不变量)
- 13.2 节点分配、allocator 参与与元素所有权(说明每个节点独立分配对生命周期和异常安全的影响)
- 13.3 insert、erase 与 splice 的指针重连路径(追踪局部修改如何保持 iterator 稳定性)
- 13.4 merge、sort 与 reverse 的链表级算法(说明 list 专属算法如何利用节点重连降低元素移动成本)
- 13.5 随机访问缺失、cache miss 与容器对比(提炼 list 相对 vector、deque 的性能边界和选型条件)
- 13.6 intrusive list 思想与 mini list 实现(把最小 list 实现整理成节点、哨兵、迭代器和修改操作)
Chapter 14: Forward List
- 14.1 单向链表、节点结构与 before_begin(说明 forward_list 的最小对象模型和头前位置设计)
- 14.2 insert_after 与 erase_after 的前驱节点语义(追踪单向链表修改为何围绕前驱位置展开)
- 14.3 forward iterator、size 缺席与遍历成本(整理迭代器能力、长度获取和复杂度承诺)
- 14.4 内存开销、list 对比与工程使用场景(提炼 forward_list 的空间收益、访问限制和选型条件)
- 14.5 mini forward_list 实现路径(把最小实现整理成节点、头前哨兵、迭代器和 after 操作)
Chapter 15: String
- 15.1 basic_string、char_traits 与 allocator 参与(整理 string 的模板参数如何决定字符操作和内存策略)
- 15.2 连续内存、null terminator 与 size / capacity(说明字符串存储状态、C 接口兼容和容量管理的关系)
- 15.3 append、insert、erase、substr 与 find(追踪常用操作如何改变字符序列、分配状态和返回对象)
- 15.4 SSO 与 copy-on-write 历史边界(整理小字符串优化和历史实现策略对性能判断的影响)
- 15.5 string_view 与
vector<char>对比(区分所有权、终止符、可变性和生命周期风险) - 15.6 工程常见坑(提炼悬垂视图、隐式分配、编码假设和接口边界的检查顺序)
Part 4: Ordered Associative Containers
Chapter 16: Red-Black Tree Foundations
- 16.1 BST、有序关系与平衡需求(说明二叉搜索树为何需要平衡条件才能支撑 STL 复杂度承诺)
- 16.2 红黑树性质、节点颜色与 tree height(整理颜色规则如何限制树高)
- 16.3 左旋、右旋与局部结构修复(追踪旋转如何保持中序顺序并改变局部高度)
- 16.4 插入修复与删除修复(说明更新路径如何恢复颜色和高度约束)
- 16.5 lower_bound、in-order traversal 与复杂度来源(提炼查找、遍历和对数复杂度之间的关系)
- 16.6 mini red-black tree 实现路径(把最小实现整理成节点、旋转、修复、迭代器和查找接口)
Chapter 17: Map and Set
- 17.1 key ordering、comparator 与 std::less(整理 map / set 如何用严格弱序建立有序键空间)
- 17.2 底层红黑树、节点结构与 iterator 实现(说明节点式有序容器如何提供稳定迭代和有序遍历)
- 17.3 lower_bound、upper_bound、equal_range 与 find(追踪有序查找接口如何复用树形搜索路径)
- 17.4 insert、erase、operator[] 与 at(整理修改和访问操作对节点、默认构造和异常边界的影响)
- 17.5 allocator、iterator 稳定性与 unordered 容器对比(给出有序容器和哈希容器的选型维度)
- 17.6 Comparator Correctness, Key Stability, and Container Selection(提炼 comparator 正确性、键不可变性、访问成本和容器选型检查顺序)
Chapter 18: Multimap and Multiset
- 18.1 duplicate key 与 equivalent keys(说明 multi 容器如何表达一键多值或重复元素)
- 18.2 equal_range 与重复键分组路径(追踪同键元素在有序树中的范围定位方式)
- 18.3 插入策略与查找策略(整理重复键进入树结构后的排序、定位和遍历规则)
- 18.4 与 map / set 的区别(给出唯一键容器和重复键容器的接口语义、复杂度和使用边界)
- 18.5 工程使用场景(提炼 multi 容器适合表达倒排关系、索引分组和排序多值的判断方法)
Part 5: Unordered Hash Containers
Chapter 19: Hash Table Foundations
- 19.1 hash function、hash value 与 bucket 定位(说明哈希表如何把键映射到桶位置)
- 19.2 bucket array、collision、chaining 与 open addressing(整理冲突处理策略对节点布局和查找路径的影响)
- 19.3 load factor、max_load_factor、rehash 与 reserve(追踪容量策略如何影响复杂度、迭代器和内存成本)
- 19.4 哈希退化、哈希攻击与输入风险(整理最坏情况的触发条件、表现和防护边界)
- 19.5 哈希表复杂度分析(提炼平均复杂度、最坏复杂度和工程负载之间的判断关系)
Chapter 20: Unordered Map and Unordered Set
- 20.1 unordered_map / unordered_set 的目标与节点布局(说明哈希容器如何用 bucket 和 node 支撑平均常数查找)
- 20.2 hash policy、std::hash 与 key_equal(整理哈希函数、相等判断和策略参数如何共同决定键定位)
- 20.3 insert、erase、find 与 operator[](追踪常用操作如何访问桶、处理冲突并影响元素状态)
- 20.4 rehash、reserve、iterator 行为与 iterator 失效(说明容量调整如何改变桶数组、迭代路径和失效规则)
- 20.5 allocator、map 对比与性能分析(给出有序容器和无序容器在稳定性、顺序、内存和性能上的选型判断)
- 20.6 Mini Hash Table Implementation and Rehash Boundary(把最小哈希表实现整理成桶数组、节点、哈希策略、rehash 和失效检查)
Chapter 21: Unordered Multimap and Unordered Multiset
- 21.1 duplicate key(说明 unordered multi 容器如何允许等价键共存,并把唯一性约束转成桶内分组问题)
- 21.2 bucket 内重复键处理(追踪等价键在同一 bucket 链中的组织方式、插入位置和遍历边界)
- 21.3 equal_range(说明 equal_range 如何依赖 hash、key_equal 和桶内顺序返回等价键范围)
- 21.4 与 unordered_map / unordered_set 的区别(给出唯一键和重复键哈希容器在插入语义、查找返回和元素数量上的判断维度)
- 21.5 工程使用场景(提炼倒排索引、多值属性、分组记录和重复标签等场景的使用条件)
Part 6: Container Adaptors
Chapter 22: Stack
- 22.1 LIFO 语义与容器适配器目标(说明 stack 如何把底层容器限制成后进先出的操作表面)
- 22.2 默认 deque 与可替换底层容器条件(整理 deque、vector、list 作为底层容器时的接口要求和成本差异)
- 22.3 push、pop 与 top 的状态路径(追踪三个核心操作如何改变或读取栈顶元素)
- 22.4 iterator 封装边界与顺序语义(说明 stack 隐藏 iterator 如何保护 LIFO 语义)
- 22.5 工程使用场景(提炼调用栈、回溯、括号匹配和状态撤销等场景的选型判断)
Chapter 23: Queue
- 23.1 FIFO 语义与容器适配器目标(说明 queue 如何把底层容器限制成先进先出的操作表面)
- 23.2 默认 deque 与可替换底层容器条件(整理底层容器必须提供的前后端操作和复杂度边界)
- 23.3 push、pop、front 与 back 的状态路径(追踪队尾入队、队首出队和端点读取的对象状态变化)
- 23.4 iterator 封装边界与顺序语义(说明 queue 隐藏 iterator 如何保护 FIFO 语义)
- 23.5 工程使用场景(提炼任务队列、BFS、事件缓冲和生产消费模型中的使用条件)
Chapter 24: Priority Queue
- 24.1 heap-backed adaptor model(说明 priority_queue 如何用底层容器和 heap 不变量表达优先级访问)
- 24.2 vector 底层容器与 comparator(整理存储布局、比较器方向和 top 语义之间的关系)
- 24.3 push、pop 与 top 的堆状态路径(追踪入队、出队和读取最高优先级元素时的调整过程)
- 24.4 make_heap、push_heap、pop_heap 与堆调整(说明 heap 算法如何维护局部和全局不变量)
- 24.5 与 set 的区别和选型边界(给出 priority_queue 和 set 在排序、查找、删除和稳定性上的判断维度)
- 24.6 工程使用场景(提炼调度、Top-K、最短路和延迟任务中的使用条件)
Part 7: STL Algorithms
Chapter 25: Algorithm Design Principles
- 25.1 iterator range 与 half-open contract(整理 iterator range、half-open range 和 first/last 边界如何定义算法输入)
- 25.2 内存边界与容器类型隔离(说明算法只处理给定区间,内存所有权和容器结构由调用方承担)
- 25.3 iterator category、predicate 与 projection(归纳算法如何根据迭代器能力和用户可插入行为选择路径)
- 25.4 复杂度承诺与修改边界(说明算法的复杂度、元素写入和顺序变化如何形成调用前提)
- 25.5 STL 算法分类(把查询、修改、排序、集合、堆和数值算法整理成可选择的功能族)
Chapter 26: Search Algorithms
- 26.1 equality search 与 predicate search(整理 find、find_if、find_if_not 如何表达值匹配和谓词匹配)
- 26.2 counting 与 boolean queries(说明 count、count_if、all_of、any_of、none_of 如何回答数量和存在性问题)
- 26.3 sequence search 与 adjacent_find(追踪 search 和 adjacent_find 如何在区间中定位子序列或相邻关系)
- 26.4 mismatch、equal 与 range comparison(说明两个区间如何按顺序比较并定位差异)
- 26.5 复杂度和 iterator 要求(提炼查询算法的遍历成本、短路条件和输入边界)
Chapter 27: Modifying Algorithms
- 27.1 copy、copy_if、move 与 transform(整理区间搬运和变换算法如何读写目标区间)
- 27.2 fill、generate 与 value production(说明填充和生成算法如何产生新值并覆盖元素)
- 27.3 remove、remove_if 与 replace 系列(追踪逻辑删除、值替换和有效区间变化)
- 27.4 reverse、rotate 与 shuffle(说明重排算法如何改变元素顺序和迭代器要求)
- 27.5 remove-erase idiom 与重叠边界(提炼容器缩短、目标区间重叠和对象生命周期的检查顺序)
Chapter 28: Sorting Algorithms
- 28.1 sort、stable_sort、partial_sort 与 nth_element(整理全排序、稳定排序、局部排序和选择算法的目标差异)
- 28.2 is_sorted 与 is_sorted_until(说明有序性检测如何给出排序前提和断点)
- 28.3 introsort、稳定性与算法策略(归纳常见排序实现如何在平均、最坏和稳定性之间取舍)
- 28.4 comparator 与 strict weak ordering(说明比较器正确性如何决定排序结果和未定义行为边界)
- 28.5 排序算法复杂度和工程选型(提炼数据规模、稳定性、局部结果和比较成本的选择顺序)
Chapter 29: Binary Search Algorithms
- 29.1 binary_search(说明二分查找如何把有序区间和比较器转成存在性判断)
- 29.2 lower_bound(追踪第一个不小于目标值的位置如何被比较器和半开区间共同决定)
- 29.3 upper_bound(追踪第一个大于目标值的位置如何形成插入点和等价范围右边界)
- 29.4 equal_range(说明 lower_bound 和 upper_bound 如何组合成等价元素范围)
- 29.5 partition_point(把二分思想推广到单调谓词分区,并说明谓词前提)
- 29.6 前提条件:已排序区间(说明排序前提、比较器一致性和分区条件如何决定结果合法性)
- 29.7 lower_bound 底层实现(把 lower_bound 整理成距离、步进、比较和收缩区间的最小实现路径)
- 29.8 iterator category 对复杂度的影响(说明 random access 和 forward iterator 在步进成本上的差异)
Chapter 30: Set Algorithms
- 30.1 set_union(说明两个有序区间如何合并成并集,并处理重复元素数量)
- 30.2 set_intersection(追踪交集算法如何只输出两边共同出现的元素)
- 30.3 set_difference(说明差集算法如何保留左侧区间独有元素)
- 30.4 set_symmetric_difference(整理对称差如何输出只在一侧出现的元素)
- 30.5 includes(说明包含关系如何通过同步扫描判断子集前提)
- 30.6 merge(追踪 merge 如何稳定合并两个有序输入区间到目标区间)
- 30.7 前提条件:有序区间(说明有序性、比较器一致性和目标区间容量如何支撑集合算法)
- 30.8 集合算法底层双指针思想(提炼双指针推进、比较结果和输出动作之间的共同判断顺序)
Chapter 31: Heap Algorithms
- 31.1 heap 数据结构(说明堆如何用连续数组表达父子关系和最大元素访问)
- 31.2 make_heap(追踪自底向上调整如何把普通区间改造成满足堆不变量的区间)
- 31.3 push_heap(说明新元素追加后如何沿父链上浮恢复堆序)
- 31.4 pop_heap(说明堆顶交换到尾部后如何下沉新根并缩短有效堆区间)
- 31.5 sort_heap(追踪反复 pop_heap 如何把堆区间转成有序区间)
- 31.6 is_heap(说明堆不变量如何被逐个父子关系检查)
- 31.7 is_heap_until(定位第一个破坏堆序的位置,并解释它对调试和验证的意义)
- 31.8 priority_queue 与 heap algorithm 的关系(区分容器适配器接口、底层 vector 存储和 heap algorithm 不变量之间的责任)
Chapter 32: Numeric Algorithms
- 32.1 accumulate、reduce 与 inner_product(整理归约类算法如何聚合区间值)
- 32.2 partial_sum、exclusive_scan 与 inclusive_scan(说明前缀计算如何生成阶段性累计结果)
- 32.3 adjacent_difference(追踪相邻元素差分如何表达变化序列)
- 32.4 transform_reduce 与并行算法基础(说明变换归约和并行执行对结合律、副作用和顺序的要求)
- 32.5 数值算法的类型和精度边界(提炼初始值类型、溢出、浮点误差和执行策略的判断方法)
Part 8: Callable Objects and Invocation
Chapter 33: Function Objects
- 33.1 function object model 与 operator()(说明函数对象如何把可调用行为变成拥有类型和状态的对象)
- 33.2 标准比较器与透明比较器(整理 std::less、std::greater、std::equal_to 和 transparent comparator 的适用边界)
- 33.3 stateful functor(说明状态仿函数如何携带参数、缓存或策略)
- 33.4 函数对象与算法(追踪算法如何通过可调用对象接收比较、过滤和变换逻辑)
- 33.5 工程使用场景(提炼模板参数、排序规则、查找规则和策略注入中的使用判断)
Chapter 34: Lambda Expressions
- 34.1 closure type 与 lambda 对象模型(说明 lambda 表达式如何生成匿名闭包类型)
- 34.2 value capture、reference capture 与生命周期(整理捕获方式对对象所有权、悬垂引用和可见状态的影响)
- 34.3 mutable lambda 与状态修改(说明 mutable 如何改变闭包对象内部状态的写入边界)
- 34.4 generic lambda(追踪 auto 参数和模板化调用运算符如何进入泛型路径)
- 34.5 lambda 与 STL 算法(提炼在算法中使用 lambda 时的比较、谓词、捕获和生命周期检查顺序)
Chapter 35: Std Function
- 35.1 type erasure 与 callable wrapper(说明 std::function 如何隐藏具体可调用类型并提供统一调用表面)
- 35.2 small object optimization 与 heap allocation(整理存储策略如何影响分配次数和对象移动)
- 35.3 调用开销与性能边界(说明间接调用、分配和类型擦除对热路径的影响)
- 35.4 与模板参数、函数指针和 lambda 的对比(区分泛型、静态调用、动态封装和生命周期边界)
- 35.5 工程使用场景(提炼回调存储、事件系统、策略对象和 API 边界中的使用条件)
Chapter 36: Bind Mem Fn and Invoke
- 36.1 std::bind(说明 bind 如何保存可调用对象、绑定参数并延迟形成一次调用)
- 36.2 std::placeholders(追踪 placeholder 如何把后续实参映射回绑定表达式的参数位置)
- 36.3 std::mem_fn(说明成员函数指针如何被包装成普通可调用对象)
- 36.4 std::invoke(整理普通函数、函数对象、成员函数指针和成员数据指针的统一调用规则)
- 36.5 成员函数调用统一化(说明对象、指针、引用包装器和成员指针如何进入同一调用路径)
- 36.6 callable 统一模型(提炼模板、算法和包装器如何依赖 INVOKE 规则判断可调用性)
- 36.7 为什么现代 C++ 更推荐 lambda(比较 lambda、bind、mem_fn 和 invoke 在可读性、类型推导、捕获状态和错误暴露上的差异)
Part 9: Traits and Template Metaprogramming
Chapter 37: Traits Design
- 37.1 traits 为什么存在(说明泛型代码为什么需要从类型中提取能力、属性和实现策略)
- 37.2 traits 作为类型信息萃取(整理 traits 如何把嵌套类型、静态值和特化结果暴露给算法)
- 37.3 编译期分发(追踪 traits 结果如何进入 tag dispatch、重载选择或条件启用)
- 37.4 policy 与 traits 的区别(区分类型事实萃取和策略注入在设计意图上的差异)
- 37.5 STL 中的 traits 体系(提炼 iterator_traits、allocator_traits、type_traits 和 char_traits 的共同角色)
Chapter 38: Iterator Traits
- 38.1 iterator_traits 作用(说明算法如何通过统一入口读取 iterator 的值类型、距离类型和能力标签)
- 38.2 value_type(说明迭代器解引用结果背后的元素类型如何参与临时对象和算法返回类型)
- 38.3 difference_type(整理两个位置之间距离如何影响 advance、distance 和随机访问运算)
- 38.4 pointer(说明 iterator 暴露指针类型时与原生指针、代理对象和 contiguous iterator 的关系)
- 38.5 reference(区分真实引用和 proxy reference 对赋值、比较和生命周期的影响)
- 38.6 iterator_category(说明旧式 iterator category 如何表达算法可使用的最强操作集合)
- 38.7 指针特化(说明原生指针如何通过 traits 特化进入 STL iterator 体系)
- 38.8 算法如何通过 traits 获取 iterator 能力(追踪算法如何根据 iterator 能力选择线性推进、随机跳转或优化路径)
Chapter 39: Type Traits
- 39.1 类型分类 traits(整理 is_same、is_integral、is_pointer、is_reference 等分类判断的用途)
- 39.2 类型转换 traits(说明 remove_reference、remove_cv、decay、add_pointer 如何生成新类型)
- 39.3 enable_if 与 SFINAE 入口(追踪 traits 如何参与重载启用和失败消除)
- 39.4 void_t 与 detection idiom(说明检测表达式合法性如何形成编译期能力查询)
- 39.5 type_traits 在 STL 中的作用(提炼 traits 如何支撑 iterator、allocator、algorithm 和 concepts 的约束表达)
Chapter 40: SFINAE
- 40.1 SFINAE 是什么(说明模板替换失败如何从硬错误转成候选函数淘汰)
- 40.2 substitution failure as overload filtering(追踪模板参数替换、表达式检查和重载候选过滤之间的关系)
- 40.3 enable_if(说明 enable_if 如何把布尔条件接入返回类型、模板参数或函数参数)
- 40.4 void_t(整理 void_t 如何把表达式合法性检测压缩成类型替换问题)
- 40.5 检测 idiom(说明 detection idiom 如何查询类型是否具备成员、表达式或嵌套类型)
- 40.6 重载选择(追踪 SFINAE 过滤后的候选集如何继续参与普通重载决议)
- 40.7 STL 中的 SFINAE(提炼容器构造、算法约束和 traits 查询中 SFINAE 的使用位置)
Chapter 41: Concepts
- 41.1 concepts 为什么出现(说明 concepts 如何把模板约束从隐式失败改成可读、可诊断的接口条件)
- 41.2 requires(追踪 requires clause 和 requires expression 如何描述类型必须支持的操作)
- 41.3 constraint(整理约束表达式、约束归一化和候选选择之间的关系)
- 41.4 std::same_as(说明类型相同性约束如何用于重载边界和泛型接口收窄)
- 41.5 std::integral(说明整数类型约束如何替代手写 traits 条件)
- 41.6 std::ranges concepts(整理 input_range、view、iterator concepts 如何支撑 ranges 算法)
- 41.7 concepts 与 SFINAE 对比(比较错误信息、约束表达、候选过滤和接口可读性的差异)
- 41.8 concepts 对 STL 的影响(提炼 concepts 如何改变算法声明、类型要求和用户错误定位)
Part 10: Modern STL
Chapter 42: Ranges
- 42.1 range concept 与 iterator + sentinel(说明 range 如何把 begin/end 和终止条件从传统同类型 iterator 中分离)
- 42.2 std::ranges::begin / end 与 ranges algorithm(整理 ranges 如何统一获取边界并改写算法调用表面)
- 42.3 projection(说明 projection 如何把成员访问或键提取纳入算法参数)
- 42.4 lazy evaluation(追踪 ranges 管线中延迟计算的触发点和生命周期边界)
- 42.5 与传统 algorithm 对比(给出接口、约束、组合性和错误表达的差异判断)
Chapter 43: Views
- 43.1 view 与 lazy pipeline(说明 view 如何表达轻量、可组合、延迟求值的范围变换)
- 43.2 filter_view 与 transform_view(追踪过滤和映射如何包装底层 range)
- 43.3 take_view、drop_view 与 iota_view(整理截断、跳过和生成型 view 的状态模型)
- 43.4 ranges::views 与 view pipeline(说明管线组合如何传递迭代器、谓词和临时对象)
- 43.5 view 生命周期问题(提炼悬垂引用、临时 range 和缓存状态的检查顺序)
Chapter 44: Span
- 44.1 non-owning contiguous memory view(说明 span 如何表达连续内存视图而不拥有元素)
- 44.2 dynamic extent 与 static extent(整理运行期长度和编译期长度的边界)
- 44.3 与 vector、array、raw pointer 的关系(给出所有权、长度信息、可变性和接口安全的对比维度)
- 44.4 生命周期问题(追踪 span 绑定到底层存储后的悬垂风险)
- 44.5 工程使用场景(提炼函数参数、buffer view、数组切片和 C 接口适配中的使用条件)
Chapter 45: String View
- 45.1 string_view 设计目标(说明 string_view 如何表达只读字符串视图,并把拷贝成本和所有权分离)
- 45.2 non-owning string reference(追踪 string_view 绑定到底层字符存储后的生命周期责任)
- 45.3 data / size(说明指针和长度如何定义可视范围,并区别于 null terminator 约定)
- 45.4 与 string 的区别(比较所有权、可变性、分配、生命周期和接口返回值的差异)
- 45.5 与 const char 的区别*(区分长度信息、终止符依赖、二进制安全和悬垂风险)
- 45.6 生命周期悬垂问题(整理生命周期悬垂问题的触发条件、可见表现、恢复策略和工程边界)
- 45.7 工程使用场景(提炼参数传递、解析切片、日志格式化和减少拷贝时的使用条件)
Chapter 46: PMR
- 46.1 memory_resource 与 allocator 多态化(说明 pmr 如何把分配策略放到运行时资源对象中)
- 46.2 monotonic_buffer_resource(整理单调分配资源适合的生命周期和释放模式)
- 46.3 pool resource 系列(比较 unsynchronized_pool_resource 和 synchronized_pool_resource 的并发和碎片边界)
- 46.4 pmr::vector 与 pmr::string(追踪容器如何通过 polymorphic allocator 接入 memory_resource)
- 46.5 工程使用场景(提炼短生命周期批量对象、arena、插件边界和性能调优中的使用条件)
Chapter 47: Constexpr STL
- 47.1 constexpr 容器支持(说明标准库对象在常量求值中创建、修改和销毁需要满足的条件)
- 47.2 constexpr algorithm(追踪算法如何在编译期处理区间并受输入可常量求值性约束)
- 47.3 编译期计算(整理 constexpr STL 如何把表生成、校验和小规模变换提前到编译期)
- 47.4 constexpr vector 的限制(说明动态分配、释放时机和常量求值规则对 constexpr vector 的约束)
- 47.5 C++20 / C++23 STL 演进(整理现代标准如何逐步扩大 constexpr 容器和算法的可用范围)
- 47.6 Compile-Time STL Safety Checks and Constant Generation(提炼编译期数据结构如何服务安全校验、生成常量和减少运行时工作)
Part 11: Mini STL Implementation
Chapter 48: Mini Allocator
- 48.1 实现 allocate(实现原始存储申请,并说明数量、对齐和异常返回的处理)
- 48.2 实现 deallocate(实现原始存储释放,并保持释放数量和分配接口的匹配关系)
- 48.3 实现 construct(用 placement new 在已分配存储上创建对象,并转发构造参数)
- 48.4 实现 destroy(显式调用析构函数,并把对象生命周期结束和内存释放分开)
- 48.5 实现 allocator_traits 简化版(把 allocator 的可选接口整理成容器可统一调用的适配层)
Chapter 49: Mini Iterator
- 49.1 实现 iterator traits(定义 value_type、difference_type、reference 和 iterator_category 的最小接口)
- 49.2 实现 random access iterator(实现指针式状态、算术运算、比较和解引用语义)
- 49.3 实现 reverse iterator(说明反向迭代器如何用底层当前位置表达前一个元素)
- 49.4 实现 iterator category 分发(用标签或 concepts 选择 distance、advance 和算法优化路径)
Chapter 50: Mini Vector
- 50.1 三指针模型与对象状态(整理 mini vector 的 begin/end/capacity 状态不变量)
- 50.2 reserve、push_back、emplace_back 与 reallocate(追踪容量增长、元素构造和迁移路径)
- 50.3 erase、clear 与 destructor(说明元素销毁、范围缩短和资源释放责任)
- 50.4 copy / move constructor 与 assignment(整理深拷贝、资源转移、自赋值和异常安全边界)
- 50.5 mini vector 验收检查点(提炼 allocator、placement new、iterator 失效和 moved-from 状态的验证顺序)
Chapter 51: Mini List
- 51.1 node 结构(定义 prev、next、value 和哨兵节点如何共同形成双向链表不变量)
- 51.2 iterator(实现节点指针包装、双向移动、解引用和端点比较)
- 51.3 insert(追踪节点分配、元素构造和四个指针重连的提交顺序)
- 51.4 erase(说明断链、析构、释放和返回后继 iterator 的责任)
- 51.5 splice(追踪不移动元素值的节点区间转移路径)
- 51.6 clear(说明整表销毁如何遍历节点并保持哨兵恢复为空状态)
- 51.7 allocator 参与(说明节点分配、对象构造和异常失败清理如何接入 allocator)
Chapter 52: Mini Deque
- 52.1 map 结构(定义控制数组如何保存 block 指针并支撑两端扩展)
- 52.2 block 结构(说明固定大小缓冲块如何承载局部连续元素)
- 52.3 iterator(实现当前元素指针、block 边界和控制数组位置之间的状态关系)
- 52.4 push_front(追踪前端预留、块切换、元素构造和 begin 更新)
- 52.5 push_back(追踪尾端容量、块分配、元素构造和 end 更新)
- 52.6 pop_front(说明前端元素销毁、块释放条件和 begin 推进)
- 52.7 pop_back(说明尾端元素销毁、块释放条件和 end 回退)
- 52.8 random access(把下标计算整理成块编号、块内偏移和 iterator 跳转)
Chapter 53: Mini Red-Black Tree
- 53.1 node 结构(定义 key/value、parent、left、right、color 和哨兵如何形成树节点状态)
- 53.2 rotate_left(说明左旋如何局部改变父子关系并保持中序顺序)
- 53.3 rotate_right(说明右旋如何与左旋对称地修复局部结构)
- 53.4 insert(追踪二叉搜索插入位置、节点构造和初始颜色设置)
- 53.5 insert_fixup(整理插入后通过变色、旋转和根节点约束恢复红黑性质)
- 53.6 erase(说明删除节点、替换后继和修复黑高的关键路径)
- 53.7 iterator(实现有序遍历中的 successor、predecessor 和端点行为)
- 53.8 lower_bound(追踪树搜索如何记录候选节点并返回第一个不小于 key 的位置)
Chapter 54: Mini Hash Table
- 54.1 bucket array(定义桶数组如何把 hash value 映射到链表入口)
- 54.2 node 结构(说明节点如何保存 key/value、next 指针和可选缓存 hash)
- 54.3 hash(整理哈希函数、取模或掩码定位和 key_equal 的配合关系)
- 54.4 insert(追踪定位 bucket、检查等价键、构造节点和挂链的顺序)
- 54.5 find(说明查找如何先定位 bucket,再在冲突链中比较 key)
- 54.6 erase(说明删除如何维护前驱指针、销毁节点并更新元素数量)
- 54.7 rehash(追踪桶数组扩容、节点重新分配到桶和 iterator 失效)
- 54.8 load_factor(说明负载因子如何触发扩容并影响平均查找成本)
Chapter 55: Mini Algorithm
- 55.1 find(实现线性扫描、谓词比较和未找到返回 last 的基本算法形状)
- 55.2 copy(实现从输入区间到输出区间的逐元素写入,并说明重叠边界)
- 55.3 move(实现移动赋值路径,并区分元素状态转移和存储位置不变)
- 55.4 lower_bound(实现基于半开区间的二分收缩,并说明 iterator 能力对成本的影响)
- 55.5 sort 简化版(选择一个最小排序策略,说明比较器、交换和复杂度边界)
- 55.6 tag dispatch(用 iterator category 选择不同实现入口)
- 55.7 iterator category 优化(比较普通线性路径和随机访问优化路径的触发条件)
Part 12: Engineering Practice and Source Reading
Chapter 56: STL Performance Model
- 56.1 性能模型超出时间复杂度(说明复杂度之外的 cache、分配、移动、失效和分支成本)
- 56.2 cache locality 与 cache miss(整理连续存储、节点存储和访问模式对缓存的影响)
- 56.3 分配次数、拷贝次数与 move 次数(追踪对象迁移和分配路径如何形成真实性能成本)
- 56.4 iterator 失效、内存碎片与分支预测(说明隐性成本如何改变容器和算法选型)
- 56.5 工程性能分析方法(提炼从操作路径、对象数量、内存布局和测量证据入手的分析顺序)
Chapter 57: Container Selection Principles
- 57.1 sequence container selection(比较 vector、deque、list、array 在内存布局、修改成本和访问模式上的差异)
- 57.2 ordered vs unordered associative containers(比较 map / set 与 unordered_map / unordered_set 的顺序、稳定性、哈希风险和查找成本)
- 57.3 container adaptor selection(比较 stack、queue、priority_queue 和 set 在受限接口与优先级语义上的差异)
- 57.4 string、string_view、array 与 span(整理文本、固定容量、非拥有视图和连续内存参数的选型边界)
- 57.5 工程选型案例(用访问模式、生命周期、稳定性、顺序要求和性能证据形成选择清单)
Chapter 58: Common STL Mistakes
- 58.1 iterator、reference 与 view lifetime(整理 iterator 失效、悬垂引用、string_view 生命周期和 lambda 捕获风险)
- 58.2 vector growth 与 unordered rehash(说明扩容和 rehash 如何让引用、指针和 iterator 失效)
- 58.3 remove_if 与 erase 的配合关系(追踪逻辑删除和容器缩短的两阶段路径)
- 58.4 comparator 与 strict weak ordering(说明比较器错误如何破坏排序和有序容器不变量)
- 58.5 std::function 性能和封装边界(提炼类型擦除、分配、间接调用和热路径成本的检查顺序)
Chapter 59: STL Source Reading Method
- 59.1 implementation landscape(说明 libstdc++、libc++ 和 MSVC STL 的实现差异与共同抽象)
- 59.2 starting points for source reading(整理 vector、allocator_traits、iterator_traits 和 algorithm 的入口选择)
- 59.3 template noise filtering(说明如何从模板参数、traits、宏和辅助层中抓住核心路径)
- 59.4 core path and call graph(追踪容器操作或算法调用如何落到对象构造、内存分配和迭代器分发)
- 59.5 source reading checklist(提炼标准语义、实现策略、版本边界和工程证据的对应关系)
Chapter 60: STL Synthesis
- 60.1 STL core ideas(总结容器、算法、iterator、allocator 和 traits 如何组成 STL 的基础模型)
- 60.2 container and algorithm decoupling(说明 iterator 作为桥梁如何把数据结构和算法分开)
- 60.3 allocator、traits 与 compile-time information(整理内存策略和编译期信息如何进入实现路径)
- 60.4 modern STL evolution(归纳 ranges、views、span、string_view、pmr 和 constexpr STL 的演进方向)
- 60.5 from STL usage to source reading(提炼从接口现象进入源码读解和工程判断的最终路径)