学而时习之:C++中的标准模板库3

64 阅读6分钟

C++ 标准模板库(STL)

STL 是一组预先写好的类和函数,借助向量、栈、映射等常用数据结构,让数据管理变得简单高效。它提供即用、高性能的算法与容器,大幅节省开发时间与精力。

STL 的组成
STL 在 C++ 中提供的特性可分为 3 大类

image.png 这些组件专为高效、灵活且可复用而设计,已成为现代 C++ 编程不可或缺的核心部分。

1.容器(Containers)

容器是用来按需求保存对象与数据的数据结构。每个容器都被实现为一个模板类,并自带完成基本操作的方法。所有 STL 容器都位于各自独立的头文件中。

容器可进一步分成 4 类:

  1. 序列容器:vector、deque、list、forward_list、array
  2. 容器适配器:stack、queue、priority_queue
  3. 关联容器:set、multiset、map、multimap
  4. 无序关联容器: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提供堆(优先队列)结构。