C++STL概览
一、核心组成模块
1. 容器体系(Containers)
-
序列容器
vector
:动态数组(随机访问O(1),尾部插入O(1))deque
:双端队列(支持高效首尾插入)list
:双向链表(任意位置插入O(1),但无随机访问)forward_list
(C++11):单向链表(内存占用更小)
-
关联容器
map
/set
:红黑树实现的有序容器(查找O(logN))multimap
/multiset
:允许重复键值
-
无序容器(C++11)
unordered_map
/unordered_set
:哈希表实现(平均查找O(1))- 支持自定义哈希函数与等价谓词
-
容器适配器
stack
:默认基于deque
实现的后进先出结构queue
:先进先出队列(可基于list
优化)priority_queue
:堆结构实现的最大优先级队列
2. 算法框架(Algorithms)
-
泛型算法设计
- 解耦数据与操作:通过迭代器接口统一访问容器
- 典型算法:
- 排序:
sort
(快速排序)、stable_sort
(归并排序) - 查找:
find
(线性搜索)、binary_search
(二分查找) - 数值运算:
accumulate
(累加)、partial_sum
(前缀和)
- 排序:
-
策略定制
- 支持自定义比较器(如
greater<>
改变排序顺序) - 谓词函数:
find_if
等算法可配合lambda表达式
- 支持自定义比较器(如
3. 迭代器机制(Iterators)
-
类型体系
迭代器类型 支持操作 典型容器 输入迭代器 只读、单遍扫描 istream_iterator
输出迭代器 只写、单遍扫描 ostream_iterator
前向迭代器 多遍扫描 forward_list
双向迭代器 支持 --
操作list
/map
随机访问迭代器 支持 +n
跳转vector
/array
-
迭代器适配器
reverse_iterator
:逆向遍历容器insert_iterator
:实现容器元素的批量插入
二、关键扩展组件
1. 函数对象与Lambda
-
函数对象(Functors)
struct Compare { bool operator()(int a, int b) const { return abs(a) < abs(b); } }; sort(v.begin(), v.end(), Compare());
-
Lambda表达式(C++11)
auto lambda = [threshold](int x) { return x > threshold; }; auto it = find_if(v.begin(), v.end(), lambda);
2. 智能指针体系(C++11)
-
unique_ptr
- 独占所有权模型,支持自定义删除器
auto ptr = std::make_unique<MyClass>(args);
-
shared_ptr
- 引用计数实现共享所有权
weak_ptr
解决循环引用问题
3. 字符串增强
string_view
(C++17)- 非拥有字符串视图,避免不必要的拷贝
void process(std::string_view sv) { // 可接受string、char[]等多种输入 }
三、系统级支持
1. 输入输出系统
-
流层次结构
-
高级特性
- 本地化支持(
std::locale
) - 格式化控制(
std::format
C++20)
- 本地化支持(
2. 并发编程模型
-
线程管理
std::jthread worker([](std::stop_token st) { // C++20 while(!st.stop_requested()) { // 后台任务 } });
-
原子操作
std::atomic<int> counter{0}; counter.fetch_add(1, std::memory_order_relaxed);
3. 数值计算工具
-
随机数库(C++11)
std::mt19937 gen(std::random_device{}()); std::uniform_int_distribution<> dis(1, 6); int dice_roll = dis(gen);
-
复数运算
std::complex<double> z(2, 3); // 2+3i
四、现代演进方向
C++标准演进
版本 | 关键特性 |
---|---|
C++11 | 移动语义、lambda、智能指针 |
C++17 | 结构化绑定、并行算法 |
C++20 | 概念约束(Concepts)、协程 |
C++23 | 堆栈踪(stacktrace)、mdspan |
设计哲学
-
泛型编程范式
- 通过模板实现算法与数据类型的完全解耦
- 例:
sort
算法可处理任何支持<
操作的类型
-
零开销原则
- 抽象不带来额外运行时开销(如
vector
与原生数组性能相当)
- 抽象不带来额外运行时开销(如
-
可扩展接口
- 允许用户自定义类型融入标准库生态(如实现迭代器接口与容器交互)
我们在努力扩大自己,以靠近,以触及我们自身以外的世界。 —博尔赫斯谈话录