STL算法概览

非更易型算法

这些算法不会改动元素值,也不会改变元素的次序。

  • 计数: 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++标准库》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值