跳到正文

C++语法、标准库与复杂度速查

公式表

对象生存期、RAII、泛型、STL、错误、并发和工程命令的条件化速查。

关联:全课程

符号说明

[first,last);O(1)/O(log n)/O(n)/O(n log n);RAII;Rule of Zero;happens-before

使用前提

完成对应课时并通过章内两道C++代码题。

适用范围

用于复算与复习;具体结论须结合C++标准版本、容器操作、对象生存期和并发同步。

C++语法、标准库与复杂度速查

声明、对象与资源

  • 使用花括号初始化抑制部分窄化;const T&可避免大对象复制并接受临时量,但不得逃逸其有效生存期。
  • unique_ptr表达独占所有权,shared_ptr表达共享计数,weak_ptr打断共享环;观察指针不拥有资源。
  • Rule of Zero优先;自管资源时再审查析构、拷贝、移动五个特殊成员。移动后对象仍有效但值通常未指定。
  • 成员按声明顺序初始化,不按初始化列表书写顺序。

泛型与STL

  • 区间采用[first,last);算法操作迭代器范围,不拥有容器。
  • vector随机访问O(1)、尾插摊销O(1)、中间插删O(n);扩容会使元素指针/引用/迭代器失效。
  • map/set典型查找O(log n);unordered_map/set平均O(1)、最坏O(n),并受哈希与重散列影响。
  • sort要求严格弱序,O(n log n);stable_sort保留等价元素相对顺序;线性查找O(n),二分查找O(log n)但要求有序与随机访问成本可控。
  • erase-remove:算法把保留元素前移并返回新逻辑结尾,容器erase才真正缩短。

错误与并发

  • 基本保证:失败后对象仍有效且无泄漏;强保证:失败如同未发生;nothrow:承诺不抛异常。
  • 输入流失败后须检查状态;清除状态前错误读取不会自动成功。外部输入验证不能用assert替代。
  • 冲突访问至少一个写且无happens-before会形成数据竞态;mutex的unlock到后续lock建立同步。
  • condition_variable::wait必须在循环中检查谓词;join确保线程结束且结果可见。

工程命令

  • 在线判题基线:g++ -std=c++17 -O2 main.cc;本地教学基线可追加-Wall -Wextra -pedantic -pthread。C++20扩展必须单独声明。
  • 调试构建可加入-g -fsanitize=address,undefined;并发另用适合环境的线程检测工具。
  • 性能比较固定编译模式、工作负载、预热、样本数和指标;大O不替代测量,单次测量不证明改进。