C++ 标准模板库(Standard Template Library, STL)是 C++ 标准库的核心组成部分,提供了一系列通用、高效的模板化数据结构和算法。它的设计基于泛型编程思想,通过高度解耦的组件实现了代码复用和灵活性。以下是 STL 的核心组成部分和特性概述:
目录
1. 核心组件
(1) 容器(Containers)
作用:存储和管理数据的对象。
分类:
顺序容器:线性排列元素(如
vector
,list
,deque
,array
,forward_list
)。关联容器:基于键(Key)有序存储(如
set
,map
,multiset
,multimap
)。无序关联容器:基于哈希表的无序存储(如
unordered_set
,unordered_map
)。容器适配器:对底层容器的封装(如
stack
,queue
,priority_queue
)。
(2) 迭代器(Iterators)
作用:提供对容器元素的统一访问接口,充当容器与算法之间的桥梁。
类型:
输入迭代器(只读)、输出迭代器(只写)
前向迭代器(单向遍历)、双向迭代器(支持反向)、随机访问迭代器(支持跳跃访问)。
示例:
vector<int> vec = {1, 2, 3}; for (auto it = vec.begin(); it != vec.end(); ++it) { cout << *it << " "; // 输出: 1 2 3 }
(3) 算法(Algorithms)
作用:操作容器中的元素,如排序、查找、遍历等。
特点:通过迭代器与容器解耦,不依赖具体容器类型。
常见算法:
sort()
,find()
,reverse()
,copy()
,transform()
,accumulate()
。
(4) 函数对象(Functors)与 Lambda
函数对象:重载了
operator()
的类,可像函数一样调用(如greater<int>
用于降序排序)。Lambda 表达式(C++11):匿名函数,简化算法的定制操作。
vector<int> nums = {3, 1, 4}; sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; }); // 降序排序
(5) 适配器(Adapters)
作用:修改组件接口(如
stack
基于deque
实现,但限制为后进先出操作)。
2. 关键特性
(1) 泛型编程
通过模板(Templates)实现类型无关的代码,例如
vector<int>
和vector<string>
使用同一套实现逻辑。
(2) 高性能
容器和算法经过高度优化(如
vector
的连续内存访问、unordered_map
的哈希表平均 O(1) 查找)。
(3) 可扩展性
允许用户自定义容器、迭代器或函数对象,并与 STL 协同工作。
3. 常用容器性能对比
容器 | 插入/删除时间复杂度 | 随机访问 | 底层结构 |
---|---|---|---|
vector |
尾部 O(1),其他 O(n) | O(1) | 动态数组 |
list |
O(1) | 不支持 | 双向链表 |
deque |
头尾 O(1) | O(1) | 分块数组 |
map /set |
O(log n) | 不支持 | 红黑树 |
unordered_map |
平均 O(1) | 不支持 | 哈希表 |
4. 典型代码示例
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 容器与算法结合
vector<int> vec = {5, 2, 8, 1, 9};
sort(vec.begin(), vec.end()); // 升序排序
// 使用 Lambda 表达式过滤偶数
auto it = remove_if(vec.begin(), vec.end(), [](int x) { return x % 2 != 0; });
vec.erase(it, vec.end());
// 输出结果:2 8
for (auto num : vec) {
cout << num << " ";
}
return 0;
}
5. 注意事项
迭代器失效:在修改容器(如
vector
扩容)时,原有迭代器可能失效。容器选择:根据场景选择合适容器(如频繁插入删除用
list
,快速查找用unordered_map
)。范围操作:算法通常作用于迭代器范围(
[begin, end)
)。C++11 增强:如
emplace
系列函数减少拷贝开销,右值引用优化资源管理。