C++ STL标准库概览

Share on:
400 Words | Read in about 2 Min | View times

STL的核心是三大组件:容器、迭代器和算法。本文通过一个概览图展示一下整个STL三大组件的逻辑关系。

本系列文章将包括以下领域:

本章其他内容请见 《现代C++》

STL标准库概览图

容器

STL容器

STL容器分为四类:顺序容器、关联容器、无序容器和容器适配器。

  • 顺序容器
容器类型 描述
array 固定大小,可随机访问元素
vector 向后快速插入,支持删除,可随机访问元素
deque 向前或后快速插入,支持删除,可随机访问元素
forward_list 单链表,任意位置快速插入和删除
list 双向链表,任意位置快速插入和删除
  • 关联容器

按键顺序保存元素

容器类型 描述
set 快速查找,不重复
map 一对一映射,键值快速查找,不重复
multiset 快速查找,可重复
multimap 一对一映射,键值快速查找,可重复
  • 无序容器

元素无序

容器类型 描述
unordered_set 快速查找,不重复
unordered_map 一对一映射,键值快速查找,不重复
unordered_multiset 快速查找,可重复
unordered_multimap 一对一映射,键值快速查找,可重复
  • 容器适配器

在顺序容器基础上做条件约束

容器类型 描述
stack 后进先出
queue 先进先出
priority_queue 堆,优先级最高先出

迭代器

STL迭代器

  • 迭代器类型
迭代器类型 描述 支持的容器类型
随机访问迭代器 可向前或向后跳转任意个元素 array, vector, deque
双向访问迭代器 在前向迭代器基础上增加向后移动 list, set, map, multiset, multimap, unordered_set, unordered_map, unordered_multiset, unordered_multimap
前向访问迭代器 输出迭代器+输入迭代器 forward_list
输出迭代器 将元素写入容器,每次只能前向一个元素 forward_list
输入迭代器 将元素读出容器,每次只能前向一个元素 forward_list

容器适配器stackqueuepriority_queue不支持迭代器。

  • 预定义迭代器
预定义迭代器 ++方向 读写
iterator 读写
const_iterator
reverse_iterator 读写
const_reverse_iterator
  • 迭代器操作
适用所有迭代器的操作 描述
++p 前置自增迭代器
p++ 后置自增迭代器
p = p1 迭代器赋值
适用输入迭代器的操作 描述
*p 引用一个迭代器
p->m 通过迭代器访问对象成员m
p == p1 判断迭代器是否相等
p != p1 判断迭代器是否不相等
适用输出迭代器的操作 描述
*p 引用一个迭代器
适用双向迭代器的操作 描述
–p 前置自减迭代器
p– 后置自减迭代器
适用随机访问迭代器的操作 描述
p += i 迭代器p前进i个位置
p -= i 迭代器p后退i个位置
p + i 迭代器p前进i的位置
p - i 迭代器p后退i的位置
p - p1 两个迭代器的距离
p[i] 返回与p距离i的元素
p < p1 判断迭代器p是否在p1之前
p <= p1 判断迭代器p是否在p1之前或相等
p > p1 判断迭代器p是否在p1之后
p >= p1 判断迭代器p是否在p1之后或相等

算法

STL算法

  • 查找算法,判断某元素是否存在
查找算法 描述
adjacent_find 在范围内查找2个连续相等的元素
binary_search 查找范围内是否包含某个目标元素
count 范围内查找相等的元素个数
count_if 范围内查找条件通过的元素个数
equal_range 范围内查找相等元素的范围迭代器对
find 范围内查找目标元素的位置
find_end 在序列A中查找序列B最后一次出现的位置
find_first_of 在序列A中,查找序列B在序列A中第一次出现任意元素的位置
find_if 查找匹配条件的首个元素的位置
find_if_not 查找不匹配条件的首个元素的位置
lower_bound 在范围内查找不小于目标值的首个元素
upper_bound 在范围内查找大于目标值的首个元素
search 在序列A中查找序列B第一次出现的位置
search_n 在范围内查找第一个符合要求的子序列
  • 排序和通用算法,提供元素排序策略
排序和通用算法 描述
inplace_merge 将这2个优需序列合并为1个升序序列,且新序列仍存储在同一个容器
merge 将2个有序序列合并为1个有序序列,这2个有序序列的排序规则相同
nth_element 对序列进行排序,并返回第n小元素,默认是升序排序,改为降序排序后是返回第n大元素
partial_sort 对范围内提取部分数据进行排序
partial_sort_copy 对范围内提取部分数据进行排序后存入新容器
partition 根据筛选条件对数据进行分组,第一组符合条件,不关心分组后各元素的具体位置
random_shuffle 随机打乱序列
reverse 反转序列
reverse_copy 反转序列并存入新容器
rotate 旋转序列,第二个参数称为序列的起始,返回指向原始第一个元素的新位置
rotate_copy 旋转序列存入新容器,其余与rotate一致
sort 对序列进行排序,不稳定排序
is_sorted 判断序列是否已经排序
statble_sort 对序列进行排序,稳定排序
stable_partion 根据筛选条件对数据进行分组,第一组符合条件,分组后各元素具体位置保持相对位置不变
  • 删除和替换算法
删除和替换算法 描述
copy 复制序列
copy_if 满足条件的元素复制到新序列
copy_n 复制n个元素到新序列
copy_backward 从最后一个元素往前开始复制到新序列,新序列也从后往前存储
iter_swap 交换迭代器的值
remove 在范围内移除指定元素
remove_copy 在范围内将非指定元素的元素复制到新序列
remove_if 在范围内移除满足条件的元素
remove_copy_if 在范围内将不满足条件的元素复制到新序列
replace 在范围内替换和指定元素匹配的元素
replace_copy 在范围内替换和指定元素匹配的元素,结果存入新序列
replace_if 在范围内替换满足条件的元素
replace_copy_if 在范围内替换满足条件的元素,结果存入新序列
swap 交换两个元素
swap_range 交换两个序列
unique 在序列中原地移除重复元素
unique_copy 在序列中移除重复元素,结果存入新序列
move 将元素移动到新序列
move_backward 从最后一个元素往前开始移动到新序列,新序列也从后往前存储
  • 排列组合算法
排列组合算法 描述
next_permutation 生成一个序列的重排列,它是所有可能的字典序中的下一个排列
prev_permutation 生成一个序列的重排列,它是所有可能的字典序中的上一个排列
  • 算术算法
算术算法 描述
accumulate 序列求和
partial_sum 创建一个新序列,每个新值代表指定范围内该位置前所有元素之和
inner_product 两个序列内积
adjacent_difference 创建一个新序列,每个新值代表当前元素与上一个元素的差
  • 生成和异变算法
生成和异变算法 描述
fill 用指定值填充序列
fill_n 以给定起始迭代器及往后n个元素为范围填充序列
for_each 在范围内迭代操作
generate 在范围内迭代操作,无法在函数内访问序列元素,只会保存函数为序列每个元素返回的值
generate_n 以给定起始迭代器及往后n个元素为范围进行与generate一样的操作
transform 将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中
iota 从给定的起始数值,逐个元素+1赋值给序列
  • 关系算法
关系算法 描述
equal 判断是否相等
includes 判断序列A的所有元素是否都在序列B中
lexicographical_compare 比较两个序列的字典序
max 返回两个元素较大值
min 返回两个元素较小值
max_element 返回范围中最大值
min_element 返回范围中最小值
minmax_element 返回范围中最大最小值迭代器组成的pair
mismatch 并行比较两个序列,返回第一个不匹配的位置
  • 条件判断算法
条件判断算法 描述
all_of 判断范围中是否所有元素满足条件
any_of 判断范围中是否有任意元素满足条件
none_of 判断范围中是否没有元素满足条件
  • 集合算法
集合算法 描述
set_union 合并两个集合所有元素到新序列,不重复
set_intersection 两个集合的交集
set_difference 两个集合的差集,包含s1存在s2不存在的元素
set_symmetric_difference 两个集合的对称差集,包含s1存在s2不存在,以及s2存在s1不存在的元素
  • 堆算法
堆算法 描述
make_heap 生成堆
pop_heap 将堆顶与末尾交换,重新堆排序
push_heap 在末尾加入新元素,重新堆排序
sort_heap 在范围内堆排序
is_heap 判断序列是否堆
Prev Post: 『C++列表初始化』
Next Post: 『STL std::sort是什么样的排序?』