STL(Standard Template Library) 是 C++ 的核心组成部分之一,它提供了一套强大的容器、算法、迭代器、仿函数和空间配置器,极大地提高了开发效率和代码复用性。下面我将从基本概念、常用容器、算法、迭代器、函数对象等方面,详细讲解 STL 的相关内容。
一、STL 概述
1.什么是 STL?
- STL 是 C++ 标准库的一部分,由 Bjarne Stroustrup 等人设计。
- 提供了通用的数据结构和算法,支持泛型编程(Generic Programming)。
2. STL 的五大组件:
- 容器(Containers)
- 算法(Algorithms)
- 迭代器(Iterators)
- 仿函数(Function Objects)
- 空间配置器(Allocators)(一般不直接使用)
二、常用 STL 容器
容器 | 类型 | 特点 | 示例 |
---|
vector | 序列容器 | 动态数组,随机访问快 | vector<int> v; |
list | 序列容器 | 双向链表,插入删除快 | list<string> l; |
deque | 序列容器 | 双端队列,两端插入删除快 | deque<char> d; |
array | 序列容器 | 固定大小数组,性能好 | array<int, 5> a; |
forward_list | 序列容器 | 单向链表 | forward_list<int> fl; |
map | 关联容器 | 键值对,按 key 排序 | map<string, int> m; |
unordered_map | 关联容器 | 哈希表,按 hash 排序 | unordered_map<string, int> um; |
set | 关联容器 | 唯一元素,按 key 排序 | set<int> s; |
unordered_set | 关联容器 | 哈希表,唯一元素 | unordered_set<string> us; |
priority_queue | 容器适配器 | 优先队列,最大/最小堆 | priority_queue<int> pq; |
三、常用 STL 算法(<algorithm>
)
算法 | 功能 | 示例 |
---|
sort() | 排序 | sort(v.begin(), v.end()); |
find() | 查找元素 | auto it = find(v.begin(), v.end(), 42); |
count() | 统计元素出现次数 | int cnt = count(v.begin(), v.end(), 42); |
copy() | 复制元素 | copy(v1.begin(), v1.end(), back_inserter(v2)); |
transform() | 转换元素 | transform(v.begin(), v.end(), v.begin(), [](int x){ return x*2; }); |
reverse() | 反转序列 | reverse(v.begin(), v.end()); |
max_element() / min_element() | 找最大/最小值 | auto it = max_element(v.begin(), v.end()); |
accumulate() | 累加 | int sum = accumulate(v.begin(), v.end(), 0); |
remove() / erase() | 删除元素 | v.erase(remove(v.begin(), v.end(), 42), v.end()); |
四、迭代器(Iterators)
1. 作用:
- 用于遍历容器中的元素。
- 是一种“指针”的抽象,可以像指针一样操作。
2.常见迭代器类型:
类型 | 说明 |
---|
begin() / end() | 返回容器的起始和结束迭代器 |
rbegin() / rend() | 反向迭代器 |
const_iterator | 只读迭代器 |
iterator | 可读可写迭代器 |
示例:
vector<int> v = {1, 2, 3, 4, 5};for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
五、函数对象(Functor)
1.什么是函数对象?
- 是一个重载了
operator()
的类对象。 - 可以像函数一样被调用,且可以携带状态。
2. 示例:
struct Add {int operator()(int a, int b) {return a + b;}
};Add add;
cout << add(2, 3); // 输出 5
3. 常见 STL 函数对象:
plus<>
, minus<>
, multiplies<>
:数学运算equal_to<>
, less<>
:比较运算bind
, function
:绑定函数参数、封装函数对象
六、STL 容器的底层实现(简要)
容器 | 实现方式 | 时间复杂度 |
---|
vector | 动态数组 | 插入/删除尾部 O(1),中间 O(n) |
list | 双向链表 | 插入/删除 O(1) |
map | 红黑树 | 插入/查找 O(log n) |
unordered_map | 哈希表 | 平均 O(1) |
set | 红黑树 | 插入/查找 O(log n) |
unordered_set | 哈希表 | 平均 O(1) |
七、STL 的优缺点
1.优点:
- 高效、灵活、可复用。
- 支持泛型编程,代码简洁。
- 丰富的容器和算法,减少重复劳动。
2. 缺点:
- 学习曲线较陡,需要理解迭代器、算法、模板等。
- 容器之间有性能差异,需合理选择。
八、常见问题与注意事项
1. 容器的迭代器失效问题
- 如
vector
在插入/删除元素后,所有迭代器可能失效。 map
、set
在插入/删除后,只有指向被删元素的迭代器失效。
2. 算法与容器的配合
- 算法通常接受迭代器范围(
begin()
到 end()
)。 - 不同容器支持的算法可能不同(如
list
不支持 random_access_iterator
)。
3. 性能优化建议
- 使用
reserve()
避免 vector
频繁扩容。 - 使用
emplace_back()
替代 push_back()
。 - 使用
unordered_map
代替 map
如果不需要排序。
九、STL 的常用头文件
头文件 | 说明 |
---|
<vector> | vector 容器 |
<list> | list 容器 |
<deque> | deque 容器 |
<map> | map 和 multimap |
<set> | set 和 multiset |
<algorithm> | 常用算法 |
<iterator> | 迭代器相关 |
<functional> | 函数对象、绑定等 |
<memory> | 智能指针(unique_ptr , shared_ptr ) |
十、STL 与 C++11/14/17/20 新特性
- lambda 表达式:方便定义匿名函数对象。
auto
类型推导:简化迭代器声明。range-based for
循环:更简洁地遍历容器。std::move
和 std::forward
:支持移动语义和完美转发。std::optional
、std::variant
:增强类型安全性。
总结:STL 核心要点
类别 | 内容 |
---|
容器 | vector , map , set , list , unordered_map 等 |
算法 | sort , find , transform , accumulate 等 |
迭代器 | begin() , end() , rbegin() , rend() 等 |
函数对象 | plus , less , bind , function 等 |
优势 | 高效、灵活、可复用 |
注意事项 | 迭代器失效、容器性能、算法兼容性 |
整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!