CppStack

C++技术栈一站式学习 · ‌业精于勤,荒于嬉;行成于思,毁于随。

C++ 学习阶段二:STL 与泛型编程(2–3 个月)

Tags = [ C++Study ]

学习目标

  • 熟练使用 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(格式化库,模板与异常处理应用丰富)
  • 实践方式
    1. 阅读项目中容器与算法的使用方式
    2. 提交小型优化(如替换低效循环为 std::algorithm
    3. 修复 bug 或增加测试用例
    4. 参与代码 review,学习模板与异常的最佳实践

6.2 实践路径

  1. 第 1–2 周:熟悉 STL 容器与算法,写小型 demo(如单词统计器、集合运算工具)。
  2. 第 3–4 周:学习模板编程,编写通用工具类(如泛型栈、泛型排序函数)。
  3. 第 5–6 周:在开源项目中提交一次与 STL/模板相关的贡献。

阶段二总结

  • STL 容器与迭代器:掌握 vector, map, unordered_map
  • STL 算法库:熟悉排序、查找、集合操作
  • 模板编程:能写函数模板与类模板,理解泛型思想
  • 异常与错误处理:提升代码健壮性
  • 调试工具:掌握 gdb / VS Debugger 的基本用法
  • 实践产出:在开源项目中完成一次与 STL/模板相关的贡献

完成阶段二后,你将具备 编写可复用组件的能力,能够承担企业项目中的功能模块开发,并逐步向高性能与工程化方向迈进。