学习目标
- 熟练使用 STL 容器与迭代器,解决常见数据存储与访问问题
- 掌握 STL 算法库,提升代码复用性与简洁性
- 理解并应用 模板编程(函数模板、类模板),实现代码抽象
- 学会 异常与错误处理,提升代码健壮性
- 掌握 调试工具(gdb / Visual Studio Debugger),提升问题定位能力
- 在开源项目中贡献 通用组件或工具函数
职业价值:能编写可复用组件,承担功能模块开发,逐步具备工程化思维。
1. STL 容器与迭代器
STL(Standard Template Library)是现代 C++ 的核心,提供了常用的数据结构与算法。
1.1 常见容器
- 顺序容器:
vector
,deque
,list
- 关联容器:
map
,set
,multimap
,multiset
- 无序容器:
unordered_map
,unordered_set
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
using namespace std;
int main() {
vector<int> v = {1, 2, 3};
v.push_back(4);
map<string, int> m;
m["apple"] = 3;
m["banana"] = 5;
unordered_map<string, int> um;
um["cat"] = 1;
um["dog"] = 2;
cout << v[2] << " " << m["apple"] << " " << um["dog"] << endl;
}
1.2 迭代器
迭代器是 STL 的“指针抽象”,统一访问容器元素。
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {10, 20, 30};
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " ";
}
}
2. STL 算法库
STL 提供了大量通用算法,避免重复造轮子。
2.1 排序与查找
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {3, 1, 4, 1, 5};
sort(v.begin(), v.end()); // 排序
if (binary_search(v.begin(), v.end(), 4)) {
cout << "Found 4\n";
}
}
2.2 集合操作
#include <algorithm>
#include <set>
#include <iostream>
using namespace std;
int main() {
set<int> a = {1, 2, 3};
set<int> b = {3, 4, 5};
vector<int> result;
set_intersection(a.begin(), a.end(), b.begin(), b.end(),
back_inserter(result));
for (int x : result) cout << x << " "; // 输出 3
}
3. 模板编程
模板是 C++ 泛型编程的核心,支持编写与类型无关的代码。
3.1 函数模板
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << add(3, 4) << endl; // int
cout << add(3.5, 2.1) << endl; // double
}
3.2 类模板
#include <iostream>
using namespace std;
template <typename T>
class Box {
T value;
public:
Box(T v) : value(v) {}
T get() const { return value; }
};
int main() {
Box<int> b1(42);
Box<string> b2("hello");
cout << b1.get() << " " << b2.get() << endl;
}
4. 异常与错误处理
4.1 基本用法
#include <iostream>
#include <stdexcept>
using namespace std;
int divide(int a, int b) {
if (b == 0) throw runtime_error("Division by zero");
return a / b;
}
int main() {
try {
cout << divide(10, 0) << endl;
} catch (const exception& e) {
cerr << "Error: " << e.what() << endl;
}
}
4.2 职业化建议
- 使用异常处理不可恢复的错误
- 对性能敏感的代码可用返回值或
std::optional
替代异常
5. 调试工具
5.1 gdb 基础
g++ -g main.cpp -o main
gdb ./main
常用命令:
break main
:设置断点run
:运行程序next
:单步执行print var
:打印变量backtrace
:查看调用栈
5.2 Visual Studio Debugger
- 设置断点(F9)
- 单步调试(F10/F11)
- 监视变量(Watch)
- 内存窗口(Memory View)
6. 学习建议与实践
6.1 参与开源项目
- 目标:在开源项目中使用 STL 与模板,贡献通用组件
- 推荐项目:
- nlohmann/json(JSON 解析库,广泛使用 STL 容器)
- fmt(格式化库,模板与异常处理应用丰富)
- 实践方式:
- 阅读项目中容器与算法的使用方式
- 提交小型优化(如替换低效循环为
std::algorithm
) - 修复 bug 或增加测试用例
- 参与代码 review,学习模板与异常的最佳实践
6.2 实践路径
- 第 1–2 周:熟悉 STL 容器与算法,写小型 demo(如单词统计器、集合运算工具)。
- 第 3–4 周:学习模板编程,编写通用工具类(如泛型栈、泛型排序函数)。
- 第 5–6 周:在开源项目中提交一次与 STL/模板相关的贡献。
阶段二总结
- STL 容器与迭代器:掌握
vector
,map
,unordered_map
等 - STL 算法库:熟悉排序、查找、集合操作
- 模板编程:能写函数模板与类模板,理解泛型思想
- 异常与错误处理:提升代码健壮性
- 调试工具:掌握 gdb / VS Debugger 的基本用法
- 实践产出:在开源项目中完成一次与 STL/模板相关的贡献
完成阶段二后,你将具备 编写可复用组件的能力,能够承担企业项目中的功能模块开发,并逐步向高性能与工程化方向迈进。