C++ STL标准库概览
400 Words | Read in about 2 Min | View times
STL的核心是三大组件:容器、迭代器和算法。本文通过一个概览图展示一下整个STL三大组件的逻辑关系。
本系列文章将包括以下领域:
本章其他内容请见 《现代C++》
容器
STL容器分为四类:顺序容器、关联容器、无序容器和容器适配器。
容器类型 |
描述 |
array |
固定大小,可随机访问元素 |
vector |
向后快速插入,支持删除,可随机访问元素 |
deque |
向前或后快速插入,支持删除,可随机访问元素 |
forward_list |
单链表,任意位置快速插入和删除 |
list |
双向链表,任意位置快速插入和删除 |
按键顺序保存元素
容器类型 |
描述 |
set |
快速查找,不重复 |
map |
一对一映射,键值快速查找,不重复 |
multiset |
快速查找,可重复 |
multimap |
一对一映射,键值快速查找,可重复 |
元素无序
容器类型 |
描述 |
unordered_set |
快速查找,不重复 |
unordered_map |
一对一映射,键值快速查找,不重复 |
unordered_multiset |
快速查找,可重复 |
unordered_multimap |
一对一映射,键值快速查找,可重复 |
在顺序容器基础上做条件约束
容器类型 |
描述 |
stack |
后进先出 |
queue |
先进先出 |
priority_queue |
堆,优先级最高先出 |
迭代器
迭代器类型 |
描述 |
支持的容器类型 |
随机访问迭代器 |
可向前或向后跳转任意个元素 |
array, vector, deque |
双向访问迭代器 |
在前向迭代器基础上增加向后移动 |
list, set, map, multiset, multimap, unordered_set, unordered_map, unordered_multiset, unordered_multimap |
前向访问迭代器 |
输出迭代器+输入迭代器 |
forward_list |
输出迭代器 |
将元素写入容器,每次只能前向一个元素 |
forward_list |
输入迭代器 |
将元素读出容器,每次只能前向一个元素 |
forward_list |
容器适配器stack
、queue
、priority_queue
不支持迭代器。
预定义迭代器 |
++方向 |
读写 |
iterator |
前 |
读写 |
const_iterator |
前 |
读 |
reverse_iterator |
后 |
读写 |
const_reverse_iterator |
后 |
读 |
适用所有迭代器的操作 |
描述 |
++p |
前置自增迭代器 |
p++ |
后置自增迭代器 |
p = p1 |
迭代器赋值 |
适用输入迭代器的操作 |
描述 |
*p |
引用一个迭代器 |
p->m |
通过迭代器访问对象成员m |
p == p1 |
判断迭代器是否相等 |
p != p1 |
判断迭代器是否不相等 |
适用双向迭代器的操作 |
描述 |
–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之后或相等 |
算法
查找算法 |
描述 |
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 |
判断序列是否堆 |