本页目录

C++ II · 现代 C++、STL、模板与并发

对标Effective Modern C++(Meyers)/ A Tour of C++ / cppreference | 前置:cpp-01(RAII、值/移动语义)、par 线(并发) cpp-01 讲 C++ 的内存与生命周期模型,这一页讲你实际写 C++ 时用的东西:STL(标准模板库)的容器与算法、模板如何实现零成本泛型(以及它的代价)、现代 C++(C++11 起)让语言好用得多的特性、以及 C++ 的并发工具与深水陷阱。读完你对 C++ 从"能看懂"到"知道怎么写得现代、安全"。

1. STL:容器 + 算法 + 迭代器的正交设计

STL 正交设计:容器—迭代器—算法解耦(m+n 而非 m×n)。

图 cpp-02.3STL 正交设计:容器—迭代器—算法解耦(m+n 而非 m×n)。

STL 是 C++ 标准库的精华,一个优雅的正交设计——容器、算法、迭代器三者解耦

现代写法:C++20 的 ranges 让 STL 可组合、可管道化(v | filter | transform,🔗 pl-02 函数式、py-01 生成器)——比裸迭代器清爽得多。

2. 模板:零成本泛型(及其代价)

模板单态化:一份代码为每个类型生成专门代码(零成本泛型)。

图 cpp-02.2模板单态化:一份代码为每个类型生成专门代码(零成本泛型)。

模板是 C++ 泛型编程的机制——写一次代码、适用多种类型,编译期为每个用到的类型生成专门代码(单态化)

读法模板 = 编译期的鸭子类型 + 单态化——威力极大(STL 全靠它),但历史上难用,现代 C++(concepts)在补救。理解它你才懂 STL 为什么能又泛型又快。

3. 现代 C++:让语言好用起来

C++11 是分水岭——之后的"现代 C++"比老 C++ 好写太多,几条必须用的:

方法论写现代 C++(C++17/20),别写"带类的 C"——用 RAII + 智能指针 + STL + auto + lambda,代码会安全清晰得多。老式手动内存管理的 C++ 是 bug 温床。

4. C++ 并发:工具与深水陷阱

C++11 起有了标准并发库(🔗 par 线、os-02):

深水陷阱(C++ 并发比大多数语言更危险)

这正是 rust 线的最佳对照:C++ 给你全部并发能力但不保证安全(自律 + 工具),Rust 用类型系统在编译期消灭数据竞争(rust-02"无畏并发")。写 C++ 并发要极度小心、配 sanitizer;这也解释了为什么新系统项目越来越多选 Rust

5. C++ vs Rust vs Python:一张收束图

Python/C++/Rust 三语言对照雷达/矩阵(内存/速度/安全/并发/适用)。

图 cpp-02.1Python/C++/Rust 三语言对照雷达/矩阵(内存/速度/安全/并发/适用)。

语言线读到这里,三门主力语言的定位可以对照收束(🔗 pl-02 的三条内存路线):

Python C++ Rust
内存 GC(引用计数+分代) 手动/RAII(你负责) 所有权(编译器强制)
速度 慢(解释+装箱),靠 C 库 最快(零成本抽象) 接近 C++
安全 运行时(动态类型) 弱(UB 多,自律+工具) 强(编译期防内存/并发 bug)
并发 GIL 限制(多进程/async 绕) 全能但危险 无畏(编译期防竞争)
适合 快速开发/数据/AI 胶水 性能关键/系统/遗留 新系统项目/安全关键

没有最好的语言,只有最合适的——Medusa 用 Python(开发快、AI 生态、I/O 密集够用),若某个热点组件要极致性能 + 可靠可考虑 Rust,C++ 则常见于你依赖的库底层(PyTorch/数据库/编译器)。理解三者的取舍,你选语言就有了框架而非偏好。

6. 练习与要点

例 1(STL 组合)std::vector + std::sort + lambda 比较器 + std::accumulate 完成一个"排序后求前 k 大的和"——体会容器/算法/迭代器解耦 + lambda 的表达力

例 2(模板与 concept) 写一个泛型 max 模板,先不加约束看错误类型传入时的报错噩梦,再加 C++20 concept 约束看报错如何变清晰——理解 concepts 为什么被引入(对照 rust-02 trait bound)。

例 3(并发对照) 写一个 C++ 多线程递增共享计数器:忘加锁 → 数据竞争(ThreadSanitizer 报警)→ 加 lock_guard 修复。再对照 rust-02 例 1(Rust 忘加锁直接编译不过)——"自律+工具 vs 编译期强制"的区别一次刻进去\(\blacksquare\)


语言线到此完整(8 页:PL 理论 2 + Python 2 + C++ 2 + Rust 2)。下一页进入工程与全栈线——全栈 I:以你运营的 Medusa 为解剖标本,追踪一个请求的一生。