algorithm 头文件定义 C标准库中用于容器的模版算法函数。目录1 说明2 接口1 说明C 标准库算法可以作用于多种数据结构不仅支持vector、list等标准库容器也支持自定义数据结构与普通数组只要满足对应算法的迭代器要求。算法的通用性依托迭代器实现算法不直接操作容器而是通过迭代器间接访问、遍历元素。标准库算法处理迭代器区间一般由起始迭代器 尾后迭代器指定。区间必须合法区间内所有迭代器都可解引用并且从起始迭代器不断自增最终必须能够抵达尾后迭代器。C20 新增范围版本算法algorithm 中绝大多数算法都提供直接接收范围range的重载。示例旧写法sort(v1.begin(), v1.end(), greaterint());C20 范围写法ranges::sort(v1, greaterint());算法命名后缀约定_if 后缀代表算法接收谓词函数对象基于元素值条件判断而非匹配固定值。find查找等于指定值的元素find_if查找满足谓词条件的元素_copy 后缀不会修改源区间内元素计算结果拷贝写入目标迭代器 / 目标区间。reverse原地反转区间元素顺序修改源reverse_copy反转源区间将结果拷贝到目标容器源保持不变算法分类可变算法修改元素的值非可变算法不修改元素重排算法改变元素顺序但不修改元素本身的值删除类算法移除区间或区间副本中的元素排序算法对区间元素重排有序区间算法仅能在已经排好序的序列上执行注意⚠️数值类算法放在独立头文件numeric函数对象与适配器定义在functional。返回布尔值的函数对象称为谓词predicate。默认二元谓词是小于运算符。参与排序的元素需要支持小于比较两个元素之间要么等价互不小于对方要么可以分出大小以此建立序列顺序。alogrithm 库内部还会用到 #include initializer_list。2 接口名称描式adjacent_find查找相邻且相等、或满足指定条件的两个元素all_of区间全部元素满足条件则返回 trueany_of区间至少一个元素满足条件则返回 truebinary_search在有序区间内判断是否存在等于或等价于目标值的元素clamp将输入值限制在给定上下界范围内copy正向将源区间元素拷贝至目标区间copy_backward从后往前将源区间元素拷贝至目标区间copy_if拷贝源区间中满足指定条件的所有元素copy_n拷贝指定数量的元素count统计区间内等于目标值的元素个数count_if统计区间内满足谓词条件的元素个数equal逐元素对比两个区间判断是否相等或满足二元谓词等价equal_range在有序区间查找目标元素的上下界区间返回一对迭代器fill给区间内所有元素赋值同一个值fill_n从起始位置开始给指定数量的元素赋同一个值find查找区间内第一个等于目标值的元素位置find_end在目标区间查找最后一个与给定子序列匹配的子序列find_first_of查找目标区间中首次出现任意一个候选值的位置find_if查找区间内第一个满足谓词条件的元素位置find_if_not查找区间内第一个不满足谓词条件的元素位置for_each按顺序对区间内每个元素执行传入函数对象并返回该函数对象for_each_n对从起点开始的 n 个元素执行函数对象generate调用函数对象生成值依次赋值给区间内每个元素generate_n调用函数对象生成值赋值给指定数量元素返回尾后迭代器includes判断有序区间 A 是否包含有序区间 B 的全部元素inplace_merge把两段连续的有序区间原地合并为单个有序区间is_heap判断当前区间是否构成堆结构is_heap_until查找区间中第一个破坏堆性质的位置前面部分为合法堆is_partitioned判断区间是否已经分区满足条件的元素全部排在不满足元素前面is_permutation判断两个区间元素是否互为排列元素集合相同顺序可不同is_sorted判断区间元素是否有序is_sorted_until查找第一个破坏有序性的位置前面部分保持有序iter_swap交换两个迭代器指向的值lexicographical_compare按字典序逐元素比较两个序列大小lower_bound有序区间查找第一个大于等于目标值的元素位置make_heap把区间元素构建成堆默认最大值在堆顶可自定义比较谓词max比较两个对象返回较大者支持自定义比较规则max_element查找区间内第一个最大元素merge合并两个有序源区间输出到目标区间结果仍然有序min比较两个对象返回较小者支持自定义比较规则min_element查找区间内第一个最小元素minmax同时比较两个输入返回 pair小值在前大值在后minmax_element一次调用同时查找区间最小值与最大值mismatch逐元素对比两个区间找到第一个不匹配的位置alg move将区间元素移动到目标区间移动语义move_backward从尾部向前移动区间元素到目标next_permutation生成字典序下一个更大排列不存在则返回 falsenone_of区间所有元素都不满足条件时返回 truenth_element分区将第 n 个元素放到最终有序位置前面元素 ≤ 它后面 ≥ 它partial_sort对区间前 N 个最小元素排序剩余元素不保证有序partial_sort_copy拷贝源区间元素到目标区间并对目标区间做部分排序partition原地分区满足谓词元素放前面不满足放后面等价元素相对顺序不保留partition_copy根据条件将元素分别拷贝到两个不同目标区间partition_point在已分区区间找到第一个不满足谓词的元素pop_heap将堆顶最大元素移到区间末尾剩余元素重新调整为堆prev_permutation生成字典序前一个更小排列不存在则返回 falsepush_heap将区间末尾新增元素并入前面已有堆重新调整堆结构random_shuffle随机重排序列C17 已废除remove从区间移除等于目标值的元素剩余元素保持顺序返回新区间尾迭代器原地逻辑删除不释放空间remove_copy拷贝源区间元素到目标跳过等于目标值的元素源区间不变remove_copy_if拷贝源区间元素到目标跳过满足谓词条件的元素源区间不变remove_if从区间移除满足谓词条件的元素剩余元素保持顺序返回新区间尾迭代器replace遍历区间把匹配指定值的元素替换为新值replace_copy拷贝源区间到目标区间拷贝过程中将匹配值替换源不变replace_copy_if拷贝源区间到目标区间拷贝过程中将满足谓词的元素替换源不变replace_if遍历区间把满足谓词条件的元素替换为新值reverse原地反转区间内元素顺序reverse_copy反转源区间元素顺序并拷贝至目标区间源不变rotate原地旋转区间交换两段相邻子区间rotate_copy旋转源区间将结果拷贝至目标区间源不变sample从源区间随机采样 n 个元素写入目标search在目标区间查找第一个与给定子序列匹配的子序列search_n查找连续 n 个等于或满足谓词目标值的子序列set_difference两个有序集合求差集输出有序结果到目标区间set_intersection两个有序集合求交集输出有序结果到目标区间set_symmetric_difference两个有序集合求对称差只属于其中一个集合输出有序结果set_union两个有序集合求并集输出有序结果到目标区间sort将区间元素升序排序可自定义比较谓词等价元素相对顺序不保证保留shuffle使用随机数生成器打乱区间元素sort_heap将堆转为有序序列stable_partition分区满足谓词放前面保留等价元素原有相对顺序stable_sort稳定排序排序后等价元素之间的原始相对顺序不变swap交换两个对象的值swap_ranges交换两个等长区间内对应元素transform对源区间或双源区间每个元素执行函数对象结果写入目标区间unique移除区间内相邻重复元素剩余元素保持顺序返回新区间尾迭代器unique_copy拷贝源区间至目标区间跳过相邻重复元素源区间不变upper_bound有序区间查找第一个大于目标值的元素位置