cs106l-lecture-1-introduction
Course: 斯坦福大学: C++标准库编程 | C++ Standard Library Programming
🎮 CS106L Lecture 1 — Introduction
🏛 课程:Stanford CS106L — Standard C++ Programming Language
📍 时长:约 1 小时
🎯 目标:理解课程定位、C++ 设计哲学、与现代 C++ 学习路径
🧭 课程定位
CS106L 是 CS106B(基础编程)与 CS107(系统编程)之间的桥梁。
它不强调语法,而强调“如何正确使用现代 C++”。
✅ “你已经能写程序了,这门课教你写出优雅、高效、可维护的 C++。”
📦 课程目标
- 掌握现代 C++(C++17 / C++20)核心语法
- 理解 STL(标准模板库)的思想与设计
- 学会阅读、理解并应用标准库文档
- 培养“C++ 思维方式”
🏷 关键词速记
C++ Philosophy|语言哲学
Abstraction|抽象
Generic Programming|泛型编程
STL|标准模板库
Efficiency|效率
Safety|安全性
🎮 30 秒课程摘要
“CS106L 不是教你写 C++,而是教你像 C++ 一样思考。”
它让你理解模板、容器、算法、迭代器这些看似复杂的概念背后的哲学。
📚 核心内容讲解
🧩 1️⃣ 为什么要学 C++?
讲师开场提问:
“你为什么还要在 2025 年学习一门 40 年前的语言?”
原因一:性能与控制权(Performance & Control)
- C++ 允许程序员几乎直接操作内存。
- 是“编译到机器的现代语言”。
- 用在游戏引擎(Unreal, Source)、浏览器(Chromium)、AI 框架(PyTorch C++ Backend)中。
原因二:抽象与表达力(Abstraction & Expressiveness)
- C++ 不只是“快”,更是“表达复杂概念的强语言”。
- 你能用模板表达算法抽象,用 RAII 保证资源安全。
原因三:桥梁语言
- C++ 连接高层与底层:
- 向上 → Python、Rust、C#
- 向下 → 汇编、操作系统、GPU
📜 教师原话:
“C++ 让你能理解计算机真正做了什么,
同时又能写出如同 Python 一样抽象的代码。”
🧩 2️⃣ C++ 的设计哲学
🏛 “Don’t pay for what you don’t use.”
—— 你只为你用到的功能付出代价。
比如模板、内联函数、constexpr 都遵守此原则。
📦 示例
int square(int x) { return x * x; } // Inline, no call overhead
若编译器能内联,它就不会生成额外的函数调用。
→ 零开销抽象(Zero-cost Abstraction)
🏛 “You control everything, but C++ protects you.”
C++ 给你自由,但也提供智能指针、RAII 来保护你。
📦 示例
{
std::unique_ptr<int> ptr = std::make_unique<int>(42);
// 自动释放,不需 delete
}这是现代 C++ 与 C 最大的区别:安全性提升 + 手感保留。
🏛 “Abstraction without penalty.”
抽象层不应该带来额外性能损耗。
这就是为什么 STL 的容器与算法能几乎与手写 for-loop 一样快。
🧩 3️⃣ CS106L 教学结构
| 周次 | 主题 | 关键概念 |
|---|---|---|
| Week 1 | Introduction | STL 与现代 C++ 设计 |
| Week 2 | Streams | 输入输出流与 operator« |
| Week 3 | Containers | vector, map, unordered_map |
| Week 4 | Iterators | 泛型访问与算法兼容 |
| Week 5 | Algorithms | sort, transform, reduce |
| Week 6 | Templates | 泛型与函数模板 |
| Week 7 | Move Semantics | 右值引用与性能优化 |
| Week 8 | Advanced Topics | Lambda, ranges, concepts |
🧩 4️⃣ STL 的灵魂哲学
“STL = 一种语言哲学,而不是一个库。”
STL 由 4 大核心组成:
1️⃣ 容器 Containers:保存数据(vector, list, map)
2️⃣ 迭代器 Iterators:抽象访问
3️⃣ 算法 Algorithms:作用于迭代器的逻辑(sort, find_if, for_each)
4️⃣ 函数对象 Function Objects:使算法与数据解耦
📦 示例
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end());
for (int n : v) std::cout << n << " ";“容器只负责保存,算法只负责操作。”
—— 这就是泛型编程 (Generic Programming) 的体现。
🧩 5️⃣ Modern C++ 的“升级理念”
| 特性 | 传统写法 | 现代写法 |
|---|---|---|
| 内存管理 | new / delete | std::unique_ptr, std::shared_ptr |
| 容器 | int arr[10] | std::vector<int> |
| 字符串 | char* | std::string |
| 泛型 | 宏 / void* | 模板 Template |
| 函数指针 | void(*f)(int) | Lambda / std::function |
🧩 6️⃣ 学习策略与教师建议
💬 教师建议:
“Don’t memorize C++. Learn to read it.”
—— 不要死记语言细节,要学会从标准库的意图去理解。
🎯 建议学习路径:
1️⃣ 写出一段错误的代码 → 用编译器错误反推机制
2️⃣ 阅读 <algorithm> 源码 → 理解模板推导
3️⃣ 用小型项目(例如文字统计器、学生管理器)实践 STL
📦 示例代码:STL 思维
std::vector<std::string> names = {"Ada", "Grace", "Linus", "Bjarne"};
std::sort(names.begin(), names.end(),
[](const std::string& a, const std::string& b){
return a.size() < b.size();
});
for (auto& name : names)
std::cout << name << " ";“这行代码就是现代 C++ 的灵魂:
用算法描述意图,而非写 for 循环。”
🧠 记忆口诀
“抽象不失速,模板不添乱;
STL 不仅是库,更是一种思想。”
🧪 实践练习
✅ 练习 1:使用 STL 容器
创建一个 std::map<std::string, int> 统计单词频率。
✅ 练习 2:使用 Lambda + sort
对 std::vector<Student> 按 GPA 排序。
✅ 练习 3:实现 RAII 思想
封装一个简单的文件自动关闭类:
struct FileGuard {
FILE* f;
FileGuard(const char* name) { f = fopen(name, "r"); }
~FileGuard() { if (f) fclose(f); }
};🪄 创作与工程建议
- 在项目中引入
<chrono>计时模块,观察算法性能差异。 - 用
std::filesystem实现跨平台文件操作。 - 学会查阅 cppreference.com —— 这是 C++ 最好的“词典”。
- 每周选一个 STL 模块阅读源码(如
<vector>)。
✅ 课程结语
“Learning C++ is learning how to express precision.”
—— 精确,是 C++ 的灵魂。
C++ 不是旧时代的遗物,
而是仍在进化的现代语言 ——
它是 Python 与汇编之间那条最坚实的桥。
是否希望我将此份 《CS106L Lecture 1 - Introduction》
导出为 .md Markdown 文件(Notion 直接可导入),带完整图标与语法高亮?