CS106B 编程抽象:C++ 实现与算法图解 · 开篇与课程概览

目录 · l1 →

资料基础:斯坦福 CS106B 官方课程网站(2026 夏季学期,8 周压缩学期,共 28 讲)全部公开页面——课程主页、Syllabus、讲座页(含各讲文字讲义与公开附件)、作业页等。完整调研记录见同目录 00_research_inventory.md(及 lecture_data_records.json 数据记录)。 版权与用途声明:官方材料 © Stanford University,受保护、不得擅自传播。本文档是自学整理笔记:将 28 讲公开内容按主题重组成 17 章,讲解均为原创中文表述,未逐字转载任何官方讲义;全部代码为本笔记撰写的教学示例(现代 C++17、仅用标准库),并非课程作业提交物。 学习建议:每章先读“概述”,再看“核心概念与算法原理”里的图示/步骤分解,然后亲手把代码敲一遍并运行,最后用“思考题”自测。链表、二叉树、堆、图这几章强烈建议边读边在纸上画内存/结构图。


课程概览

这门课是什么?

CS106B(Programming Abstractions,编程抽象)是斯坦福入门编程序列的第二门课。先修 CS106A 用 Python 建立了编程方法论与问题求解基础;CS106B 在此基础上做三件大事:

  1. 学一门新语言:C++(类型系统、函数、字符串、类、指针与动态内存);
  2. 掌握编程抽象:认识“抽象数据类型”(ADT)——把“用什么”与“怎么实现”分开,先会用(客户端视角),再自己实现(实现者视角);
  3. 吃透经典数据结构与算法:线性表、栈、队列、集合/映射、树、堆、哈希表、图,以及递归、回溯、分治、贪心(Dijkstra、霍夫曼)、复杂度分析(大 O)。

官方 syllabus 给的主题推进顺序(“近似顺序”)正是本文档 17 章的骨架:

C++ 基础 → 数据抽象与经典 ADT → 递归与回溯 → 类与面向对象 → 指针与动态内存 → 链式数据结构 → 进阶算法

与 CS106A 的衔接

  • CS106A 结业水平 = 能写多函数程序、会用循环/条件/列表/字典、理解基础测试。CS106B 不重复教编程入门,而是以“你会写程序”为前提,快速补 C++ 语法差异后直接进入抽象与算法。
  • Python 经验迁移要点:列表→std::vector、字典→std::map/std::unordered_map、集合→std::set/std::unordered_set、字符串 API 差异大(C++ 字符串可原地修改)、一切传参默认按值拷贝(要显式写 & 引用)。这些差异会在 Lecture 1–3 反复强调。

官方课程要点(摘自 syllabus,概括)

  • 教学团队:讲师 Sean(Szumlanski)、Head TA Butch、14 名 section leaders;小班讨论每周一次、占 5%。
  • 节奏与考核:8 周、28 讲(MTWTh 13:30–14:45,NVIDIA Auditorium);作业 25% + 期中 27.5% + 期末 37.5% + 小班 5% + 讲座小测 4% + Quiz0 1%;期中 7/17、期末 8/14(纸笔)。
  • 作业(8 个,约每周一个,10–20 小时/个): | # | 名称 | 覆盖主题(对应章节) | |—|—|—| | 0 | Welcome to CS106B! | 环境与工具 | | 1 | Getting Your C++ Legs | C++ 基础、字符串(L1) | | 2 | Fun with Collections | 栈/队列/集合/映射等 ADT(L2–L3) | | 3 | Recursion Etudes | 递归(含分形)(L5) | | 4 | Recursive Backtracking | 回溯(L6) | | 5 | Tone Matrix | 类/数组/动态内存(L8–L9) | | 6 | Listy Things | 链表与树(L11–L12) | | 7 | Huffman Coding(选做🌱) | 霍夫曼编码(L13) |
  • 工具:Qt Creator(编辑器+编译器)+ Stanford C++ Library(课程专用容器库,文档公开:web.stanford.edu/dept/cs_edu/resources/cslib_docs/)。本文档代码一律用标准库 std:: 容器(等价关系见文末速查表),保证你能在任何现代 C++ 环境编译运行。
  • 教科书:Eric Roberts, Programming Abstractions in C++(第 5 版),ISBN 978-0133454840。
  • 学习目标(概括):乐于用编程解决现实问题;识别常见抽象;理解日常技术背后的程序化概念;能用递归/算法推理拆分复杂问题;能评估数据结构与算法的设计取舍。

学习路线:真实 28 讲 ↔ 本文 17 章

官方 2026 夏季学期 28 讲实际顺序如下。本文档按官方教学顺序把它重组成 17 章主题笔记(每章开头标注“对应真实讲座 Lxx–Lyy”),数字编号即学习顺序:

本文章主题对应官方讲座
Lecture 1C++ 基础回顾与 STL 容器入门L01 Welcome! · L02 C++ Fundamentals · L03 C++ Strings · L04 Testing, Vectors, and Grids
Lecture 2栈与队列L05 Stacks and Queues
Lecture 3集合与映射(基于树的有序容器)L06 Sets and Maps
Lecture 4算法分析:大 O 记号L07 Big-O and Algorithmic Analysis
Lecture 5递归:原理与递归策略L08 Introduction to Recursion · L09 More Recursion · L10 Recursive Problem Solving
Lecture 6递归回溯与枚举L11 Recursive Backtracking and Enumeration · L12 More Recursive Backtracking
Lecture 7排序算法L13 Sorting Algorithms
(L14 Problem Solving Day 为复习/答疑,并入相关章节练习)  
Lecture 8面向对象编程:类与封装L15 Object-Oriented Programming
Lecture 9指针、数组与动态内存管理L16 Pointers and Arrays · L17 Dynamic Memory Management
Lecture 10优先队列与二叉堆L18 Priority Queues and Binary Heaps
Lecture 11链表L19 Introduction to Linked Lists · L20 More Linked Lists
Lecture 12二叉树、二叉搜索树与遍历L21 Binary Trees, BSTs, and Tree Traversals · L22 More on Binary Trees
Lecture 13霍夫曼编码L23 Huffman Coding
Lecture 14散列与哈希表L24 Hashing
Lecture 15图:表示、遍历与拓扑排序L25 Graphs
Lecture 16最短路径:Dijkstra 与 A*L26 Dijkstra and A* · L27 Graph Coding
Lecture 17拓展专题:Trie 与并查集延伸内容(官方未设独立讲座;L24 曾提及 trie 思路)

(L28 Wrap 为期末回顾,无新主题。)

笔记约定

  • 每章统一结构:概述 → 核心概念与算法原理 → 代码示例与实现详解(代码做什么 / 实现机制解说)→ 复杂度分析 → 关键要点 → 常见陷阱与注意事项 → 思考题(带答案)
  • ASCII 图一律放在 text 代码块中;cpp 代码块可直接复制编译。
  • 术语采用“中文(English)”或“English(中文)”双语标注,方便对照原版材料。