C++ 标准模板库(STL)
STL 是一组预先写好的类和函数,借助向量、栈、映射等常用数据结构,让数据管理变得简单高效。它提供即用、高性能的算法与容器,大幅节省开发时间与精力。
STL 的组成
STL 在 C++ 中提供的特性可分为 3 大类:
这些组件专为高效、灵活且可复用而设计,已成为现代 C++ 编程不可或缺的核心部分。
1.容器(Containers)
容器是用来按需求保存对象与数据的数据结构。每个容器都被实现为一个模板类,并自带完成基本操作的方法。所有 STL 容器都位于各自独立的头文件中。
容器可进一步分成 4 类:
- 序列容器:vector、deque、list、forward_list、array
- 容器适配器:stack、queue、priority_queue
- 关联容器:set、multiset、map、multimap
- 无序关联容器:unordered_set、unordered_multiset、unordered_map、unordered_multimap
无需自己写链表、栈等结构,STL 直接提供现成容器:快速、可靠、易用,并且借助模板类型安全,可存放任意数据类型。
2.算法(Algorithms)
STL 算法库提供了一大批通用函数,用来对数据(主要是容器里的元素)执行常见操作。这些函数已经帮你选好了最高效的实现,涵盖排序、查找、修改、统计等各类任务。所有算法都定义在 <algorithm> 和 <numeric> 两个头文件中。
最常用的算法一览:
- sort:默认将元素升序排列
- binary_search:判断有序区间中是否存在某个值
- find:查找给定值的第一次出现位置
- count:统计某值在区间内出现的次数
- reverse:将区间元素顺序颠倒
- accumulate:求区间内所有元素的累加和
- unique:去除相邻的重复元素
- lower_bound:返回有序区间中第一个 ≥ 给定值的迭代器
- upper_bound:返回有序区间中第一个 > 给定值的迭代器
- replace:把区间内所有旧值替换成新值
无需自己实现,拿来即用,高效又安全。
3.迭代器(Iterators)
迭代器是 “类似指针” 的对象,用来指向 STL 容器中的元素内存地址。它是把算法与容器无缝衔接的桥梁,所有迭代器功能都定义在头文件 <iterator> 中。
C++ STL 算法库(Algorithms)
算法是“开箱即用”的函数,帮你对容器(数组、vector、set 等)完成查找、排序、计数、比较等常见操作,全部定义在 <algorithm> 与 <numeric> 两个头文件中。
算法分类一览
1. 查找算法
在容器里快速定位元素,无需手写循环。
find():找指定值,返回迭代器。find_if():找第一个满足条件的元素。binary_search():判断有序区间中是否存在某值。lower_bound():返回第一个 ≥ 给定值的迭代器。upper_bound():返回第一个 > 给定值的迭代器。count():统计某值出现次数。count_if():统计满足条件的元素个数。find_end():找子序列最后一次出现的位置。
2. 排序与重排算法
改变元素顺序或位置。
sort():默认升序排序。stable_sort():排序并保留相等元素的原始相对次序。partial_sort():仅把前 N 个元素排好,其余不管。nth_element():让第 n 个元素处于“已排序”时的位置,前面更小、后面更大,但不保证完全有序。is_sorted():判断区间是否已升序。is_sorted_until():返回有序性第一次被打破的位置。
3. 修改/操纵算法
更新或搬移元素,不一定涉及排序/查找。
copy():把一段元素原样复制到另一段区间。copy_if():只复制满足条件的元素。copy_n():精确复制 n 个元素。copy_backward():从末端开始反向复制,避免覆盖。move():将元素“搬”到新区间,源区留下有效但未指定状态。swap():交换两个元素的值。replace():把所有旧值替换成新值。replace_if():把满足条件的元素替换成新值。remove():把不等于给定值的元素挤到前面,返回新逻辑终点(不减小容器大小)。fill():给区间内每个元素赋同一值。transform():对每个元素应用函数,结果写入另一区间。generate():反复调用生成器函数,为区间产生值。shuffle():随机打乱区间元素。
4. 计数与比较算法
按条件统计或对比区间。
count():返回等于指定值的元素个数。count_if():返回满足条件的元素个数。equal():判断两区间元素是否完全相同且顺序一致。mismatch():找到两区间第一次出现差异的位置并返回对应迭代器。lexicographical_compare():按字典序比较两区间大小。is_permutation():判断两区间是否互为排列(元素相同,顺序任意)。
C++ STL 中的容器(Containers)
标准模板库(STL)提供了常用数据结构的内置实现,称为“容器”。容器是一种持有对象,用于存储其他对象(称为其“元素”)的集合。它们以类模板的形式实现,因而对数据类型具有极大的灵活性。
C++ STL 中的容器主要分为 4 大类:
1. 序列容器(Sequence Containers)
序列容器实现线性数据结构,元素可按顺序访问。STL 提供的序列容器如下:
| 容器名称 | 说明 |
|---|---|
Array | 对固定大小静态数组的封装。 |
Vector | 可自动扩容的动态数组。 |
Deque | 由多个定长数组组成的动态数组,支持在两端快速插入与删除。 |
List | 双向链表的实现。 |
Forward List | 单向链表的实现。 |
2. 关联容器(Associative Containers)
关联容器按某种排序顺序存储数据,借助红黑树等平衡树结构,可在 O(log n) 时间内完成查找、插入与删除。
| 容器名称 | 说明 |
|---|---|
Set | 元素唯一,按值排序的集合。 |
Map | 键值对集合,按键排序,键唯一。 |
Multiset | 允许多个相同值,按值排序的集合。 |
Multimap | 允许多个相同键,按键排序的键值对集合。 |
3. 无序关联容器(Unordered Associative Containers)
无序关联容器采用哈希表实现,无需排序,平均 O(1) 查找、插入、删除(最坏 O(n))。
| 容器名称 | 说明 |
|---|---|
Unordered Set | 元素唯一,按哈希值组织的集合。 |
Unordered Map | 键值对集合,按键的哈希值组织,键唯一。 |
Unordered Multiset | 允许多个相同值,按哈希值组织的集合。 |
Unordered Multimap | 允许多个相同键,按键的哈希值组织的键值对集合。 |
4. 容器适配器(Container Adapters)
容器适配器通过改变底层容器的接口,提供特定数据结构的行为。
| 容器名称 | 说明 |
|---|---|
Stack | 提供后进先出(LIFO)的栈结构。 |
Queue | 提供先进先出(FIFO)的队列结构。 |
Priority Queue | 提供堆(优先队列)结构。 |