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++。”

📦 课程目标

  1. 掌握现代 C++(C++17 / C++20)核心语法
  2. 理解 STL(标准模板库)的思想与设计
  3. 学会阅读、理解并应用标准库文档
  4. 培养“C++ 思维方式”

C++ Philosophy|语言哲学

Abstraction|抽象

Generic Programming|泛型编程

STL|标准模板库

Efficiency|效率

Safety|安全性


“CS106L 不是教你写 C++,而是教你像 C++ 一样思考。”

它让你理解模板、容器、算法、迭代器这些看似复杂的概念背后的哲学。



讲师开场提问:

“你为什么还要在 2025 年学习一门 40 年前的语言?”

原因一:性能与控制权(Performance & Control)

  • C++ 允许程序员几乎直接操作内存。
  • 是“编译到机器的现代语言”。
  • 用在游戏引擎(Unreal, Source)、浏览器(Chromium)、AI 框架(PyTorch C++ Backend)中。

原因二:抽象与表达力(Abstraction & Expressiveness)

  • C++ 不只是“快”,更是“表达复杂概念的强语言”。
  • 你能用模板表达算法抽象,用 RAII 保证资源安全。

原因三:桥梁语言

  • C++ 连接高层与底层:
    • 向上 → Python、Rust、C#
    • 向下 → 汇编、操作系统、GPU

📜 教师原话:

“C++ 让你能理解计算机真正做了什么,

同时又能写出如同 Python 一样抽象的代码。”


—— 你只为你用到的功能付出代价。

比如模板、内联函数、constexpr 都遵守此原则。

📦 示例

int square(int x) { return x * x; } // Inline, no call overhead

若编译器能内联,它就不会生成额外的函数调用。

→ 零开销抽象(Zero-cost Abstraction)


C++ 给你自由,但也提供智能指针、RAII 来保护你。

📦 示例

{
    std::unique_ptr<int> ptr = std::make_unique<int>(42);
    // 自动释放,不需 delete
}

这是现代 C++ 与 C 最大的区别:安全性提升 + 手感保留。


抽象层不应该带来额外性能损耗。

这就是为什么 STL 的容器与算法能几乎与手写 for-loop 一样快。


周次主题关键概念
Week 1IntroductionSTL 与现代 C++ 设计
Week 2Streams输入输出流与 operator«
Week 3Containersvector, map, unordered_map
Week 4Iterators泛型访问与算法兼容
Week 5Algorithmssort, transform, reduce
Week 6Templates泛型与函数模板
Week 7Move Semantics右值引用与性能优化
Week 8Advanced TopicsLambda, ranges, concepts

“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) 的体现。


特性传统写法现代写法
内存管理new / deletestd::unique_ptr, std::shared_ptr
容器int arr[10]std::vector<int>
字符串char*std::string
泛型宏 / void*模板 Template
函数指针void(*f)(int)Lambda / std::function

💬 教师建议:

“Don’t memorize C++. Learn to read it.”

—— 不要死记语言细节,要学会从标准库的意图去理解。

🎯 建议学习路径:

1️⃣ 写出一段错误的代码 → 用编译器错误反推机制

2️⃣ 阅读 <algorithm> 源码 → 理解模板推导

3️⃣ 用小型项目(例如文字统计器、学生管理器)实践 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 直接可导入),带完整图标与语法高亮?