非更易型算法
这些算法不会改动元素值,也不会改变元素的次序。
-
计数: count/count_if
- 线性复杂度
-
最大值最小值:max_element/min_element/minmax_element
- 线性复杂度
-
查找元素
- 查找第一个匹配元素:find/find_if/find_if_not
- 查找前n个连续匹配值:search_n
- 查找第一个子区间:search
- 查找最后一个子区间:find_end
- 查找某元素第一次出现的地点:find_first_of
- 查找两个连续且相等的元素:adjacent_find
- 以上均线性复杂度
-
区间比较
- 检验相等:equal
- 测试不定序之相等性:is_permutation(不关心顺序)
- 查找第一处不同:mismatch
- 小于:lexicographical_compare
- 线性复杂度
-
检验区间
- 是否有序:is_sorted/is_sorted_until
- 是否被分割:is_partitioned/partition_point
- 是否是heap: is_heap/is_heap_until
- all/any/none: all_of/any_of/none_of
- 线性复杂度
更易型算法
这些算法会改变/变动区间内的元素内容。
注意,目标区间不能是associative/unordered类型容器,因为它们的元素为常量,不允许任意改动。
-
复制元素
- copy/copy_if/copy_n/copy_backward
- 线性复杂度
-
搬移元素
- move/move_backward
- 线性复杂度
-
转换结合元素
- transform
- 线性复杂度
-
互换元素
- swap_ranges
- 线性复杂度
-
赋值
- 赋予相同的值:fill/fill_n
- 赋予新生值:generate/generate_n
- 赋予一系列递增值:iota
- 线性复杂度
-
替换元素
- 替换序列内元素:replace/replace_if
- 复制并替换元素:replace_copy/replace_copy_if
- 线性复杂度
移除型算法
根据某一准则,在一个区间内移除某些元素。
注意,这些算法不会改变元素的数量,它们只是以逻辑上,将原本置于后面的元素向前移动,覆盖那些应该被移除的元素,返回新区间的逻辑终点。
-
移除某些元素
- 移除序列内某些元素: remove/remove_if
- 复制时一并移除元素:remove_copy/remove_copy_if
- 线性复杂度
-
移除重复元素
- 移除连续重复元素: unique
- 复制过程中移除重复元素:unique_copy
- 线性复杂度
变序型算法
这些算法会改变元素的次序,但不改变元素的值。
注意:这些算法不能用于associative和unordered容器。
-
反转元素次序
- reverse/reverse_copy
- 线性复杂度
-
旋转元素
- 旋转序列内元素:rotate
- 复制并旋转元素:rotate_copy
- 线性复杂度
-
排列元素
- next_permutation/prev_permutation
- 线性复杂度
-
对元素重新洗牌
- 以随机数重新洗牌:shuffle/random_shuffle
- 线性复杂度
-
将元素向前搬
- partition/stable_partition
- 线性复杂度
-
划分为两个子区间
- partition_copy
- 线性复杂度
排序算法
STL支持完全排序和局部排序,如果局部排序满足需求,则应优先使用它,因为它的效率较高。
associative容器会自动排序,但对全体元素进行一次性排序,通常比“始终让它们保持排序状态”更高效。
-
对所有元素排序
- sort/stable_sort
- 复杂度:nlogn
-
局部排序
- partial_sort/partial_sort_copy
- 复杂度:nlogn——线性之间
-
根据第n个元素排序
- nth_element
- 线性复杂度
-
Heap算法
- make_heap/push_heap/pop_heap/sort_heap
- Heap是实现priority queue的一个理想结构,heap算法被priority_queue容器使用
已排序区间算法
适用于区间已经有序,它通常会具有明显的效能优势。
如果这些算法作用于未排序的区间,将导致不明确的行为。
-
查找元素
- 检查某元素是否存在:binary_search
- 检查数个元素是否存在:includes
- 查找第一个或最后一个可能位置:lower_bound/upper_bound
- 查找区间位置:equal_range
- 复杂度各不相同
-
合并元素
- 两个已排序集合的总和:merge
- 两个已排序集合的并集:set_union
- 两个已排序集合的交集:set_intersection
- 两个已排序集合的差集:set_difference
- 两个已排序集合的互差:set_symmetric_difference
- 合并连贯之已排序区间:inplace_merge
数值算法
用于数值运算,需要包含头文件:。
-
运算后产生结果
- 对数列运算:accumulate
- 计算两数列内积:inner_product
- 线性复杂度
-
相对数列和绝对数列之间的转换
- 相对值转换为绝对值:partial_sum
- 绝对值转换为相对值:adjacent_difference
- 线性复杂度
小结
STL提供了丰富的算法,以便于对标准容器进行一系列操作。
本文只是简单罗列出了算法的类型和名称,关于算法的具体使用和示例,可以方便地找到相关资料。
关于更深层次的内容,如,算法背后的数据结构、效率、复杂度等,可以继续探索。
参考资料
《STL C++标准库》