cs106l-lecture-4-4-stl-summary-capstone-exampl

Course: 斯坦福大学: C++标准库编程 | C++ Standard Library Programming


🎮 CS106L Lecture 4.4 — STL Summary & Capstone Example

🏛 课程:Stanford CS106L — Standard C++ Programming Language

📍 主题:STL 总结与综合案例(The STL Summary & Federalist Papers Example)

🎯 目标:回顾 STL 四大支柱(容器、算法、迭代器、函数对象),通过一个实际示例展示 C++ 标准库的力量与思想。


本讲是 STL 模块的收官课

它总结了前面所有概念,并通过一个实战项目展示:

如何组合使用容器、流、算法与 lambda 构建完整的程序。

“STL 是 C++ 的灵魂 —— 抽象、泛型、效率、优雅。”


Container|容器

Iterator|迭代器

Algorithm|算法

Functor|函数对象

Lambda|匿名函数

Stream|流

Cosine Similarity|余弦相似度

Abstraction|抽象化


“学完 STL,不只是会用 vector 或 sort,

而是理解一种编程哲学:

用抽象描述意图,而非命令机器。



模块核心角色示例
容器 (Container)存放数据的结构vector, map, set, deque
迭代器 (Iterator)访问容器元素的“指针”begin(), end(), ++it, *it
算法 (Algorithm)操作数据的通用函数sort, count_if, transform
函数对象 (Function Object)行为抽象(函数/谓词/lambda)[](int x){ return x>0; }

📦 核心理念:

算法与容器解耦 → 由迭代器连接

函数与行为解耦 → 由谓词或 lambda 定义

STL 是“泛型函数式编程”的实现。


  • 抽象化而不牺牲性能(Zero-cost Abstraction)
  • 容器无关的算法体系
  • 编译期多态(Templates)
  • 安全可控的自由(RAII + 类型系统)

📜 教师原话:

“STL 不仅是一组类,而是一种思想架构。”


该例展示如何使用 STL 完成“文本风格分析”。

思路:比较不同作者文本的单词使用频率分布。


📦 示例代码:

std::ifstream file("federalist_hamilton.txt");
std::vector<std::string> words;
std::string word;
while (file >> word)
    words.push_back(word);

🧩 讲解:

  • ifstream 文件流可直接与 >> 操作符结合。
  • 通过 while (file >> word) 自动分词。
  • 存入 vector 用于后续分析。

📦 示例代码:

std::transform(words.begin(), words.end(), words.begin(),
               [](std::string w){
                   std::transform(w.begin(), w.end(), w.begin(),
                                  ::tolower);        // 转小写
                   w.erase(std::remove_if(w.begin(), w.end(),
                                  [](char c){ return !isalpha(c); }),
                           w.end());                 // 去掉标点
                   return w;
               });

🧩 讲解:

  • 外层 transform 处理每个单词。
  • 内层 transform 转换字符大小写。
  • remove_if + erase 去除非字母符号。

📤 效果:

原始文本 "Hello,""hello"


📦 示例代码:

std::map<std::string, int> freq;
for (auto& w : words)
    ++freq[w];

🧩 讲解:

  • map 自动排序 + 快速查找。
  • 每次遇到单词自动计数。

📤 示例输出:

"the": 1450
"to": 902
"and": 870
...

📦 示例函数:

double cosineSimilarity(const std::map<std::string, int>& A,
                        const std::map<std::string, int>& B) {
    double dot = 0, magA = 0, magB = 0;
    for (auto& [w, a] : A) {
        double b = B.count(w) ? B.at(w) : 0;
        dot += a * b;
        magA += a * a;
    }
    for (auto& [w, b] : B)
        magB += b * b;
    return dot / (sqrt(magA) * sqrt(magB));
}

🧩 讲解:

  • 用词频表构成“高维词向量”
  • 点积与模长计算相似度
  • 结果越接近 1,风格越相似

📤 输出示例:

Similarity(Hamilton, Madison) = 0.82
Similarity(Hamilton, Jay) = 0.65

📦 示例代码:

std::vector<std::pair<std::string, double>> sims = {
    {"Madison", cosineSimilarity(hamilton, madison)},
    {"Jay", cosineSimilarity(hamilton, jay)}
};

std::sort(sims.begin(), sims.end(),
          [](auto& a, auto& b){ return a.second > b.second; });

for (auto& [name, sim] : sims)
    std::cout << name << ": " << sim << "\n";

📤 输出:

Madison: 0.82
Jay: 0.65

🧩 讲解:

std::sort + lambda 可轻松实现按相似度排序。


思想对应语法
容器独立性同一算法可作用于不同容器
算法解耦逻辑与数据分离
函数即逻辑单元Lambda、谓词、函数对象
抽象层性能无损transform, map, sort 全部零开销抽象

📜 教师原话:

“You can express entire ideas with just algorithms and iterators.”


模块内容
<regex>正则表达式匹配与替换
<thread> / <future>多线程与异步计算
<filesystem>文件系统操作(C++17)
Boost Libraries实验性 STL 扩展,如 boost::optionalboost::graph
ranges (C++20)新一代“可组合算法系统”,简化管道式操作

📦 示例:C++20 ranges

#include <ranges>
auto evens = v | std::views::filter([](int x){ return x % 2 == 0; })
               | std::views::transform([](int x){ return x * x; });
for (int n : evens) std::cout << n << " ";

📤 输出: 4 16 36

🧩 讲解:

Ranges 是 STL 的现代化演进:函数式链式风格。


“STL 把算法从数据中解放出来,

把逻辑从结构中抽象出来,

把复杂变成组合。”


“容器装数据,算法行天下;

Lambda 接逻辑,抽象不掉价。”


练习 1:文本频率统计器

实现从文件读取单词 → 统计 → 按频率排序输出。

练习 2:相似度检测

比较两个文本的词频分布,计算 cosine similarity。

练习 3:STL 组合实验

使用 transform + copy_if + accumulate 构造一个简单管道。

练习 4:使用 ranges 改写

将上面的逻辑改写成 C++20 ranges 链式表达式。


  • STL 是现代 C++ 的基础,应掌握其思想而非死记 API。
  • 学会组合算法与 lambda,构建“声明式”逻辑。
  • 用容器 + 迭代器代替原始指针操作。
  • 熟悉 <algorithm><numeric> 中常用函数。
  • 建议阅读 Boost 与 ranges-v3 源码,理解标准库演化。

模块精髓示例
容器数据存储vector, map, set
迭代器数据访问begin(), end()
算法数据处理sort, copy_if, count_if
Lambda行为表达[](int x){ return x>0; }
STL 精神抽象与高效统一泛型 + 模板 + 零开销抽象

“STL 不只是库,而是一种思维方式 ——

它教你如何以数学般的方式思考代码。”