目录
1 各种常见算法的用法
1.1 非可变序列算法
1.2 可变序列算法
1.3 Partitions
1.4 排序算法
1.5 查找算法
1.6 集合算法
1.7 堆算法
1.8 最大最小值算法
1.9 其他算法
1 各种常见算法的用法
STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。
STL中算法大致分为四类:
- 1、非可变序列算法:指不直接修改其所操作的容器内容的算法。
- 2、可变序列算法:指可以修改它们所操作的容器内容的算法。
- 3、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
- 4、数值算法:对容器内容进行数值计算。
1.1 非可变序列算法
all_of | all_of() 算法会返回 true,前提是序列中的所有元素都可以使谓词返回 true |
any_of | any_of() 算法会返回 true,前提是序列中的任意一个元素都可以使谓词返回 true |
none_of | none_of() 算法会返回 true,前提是序列中没有元素可以使谓词返回 true |
for_each | for_each算法用于遍历容器中的元素 |
find | find() 函数本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。 |
find_if | 和 find() 函数相同,find_if() 函数也用于在指定区域内执行查找操作。不同的是,前者需要明确指定要查找的元素的值,而后者则允许自定义查找规则。 |
find_if_not | find_if_not() 函数和 find_if() 函数的功能恰好相反,通过上面的学习我们知道,find_if() 函数用于查找符合谓词函数规则的第一个元素,而 find_if_not() 函数则用于查找第一个不符合谓词函数规则的元素。 |
find_end | find_end() 函数定义在<algorithm> 头文件中,常用于在序列 A 中查找序列 B 最后一次出现的位置。 |
find_first_of | find_first_of() 函数用于在 [first1, last1) 范围内查找和 [first2, last2) 中任何元素相匹配的第一个元素。如果匹配成功,该函数会返回一个指向该元素的输入迭代器;反之,则返回一个和 last1 迭代器指向相同的输入迭代器。 |
adjacent_find | adjacent_find() 函数用于在指定范围内查找 2 个连续相等的元素。 |
count | 利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。 |
count_if | 利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。 |
mismatch | equal() 算法可以告诉我们两个序列是否匹配。mismatch() 算法也可以告诉我们两个序列是否匹配,而且如果不匹配,它还能告诉我们不匹配的位置。 |
equal | 可以用和比较字符串类似的方式来比较序列。如果两个序列的长度相同,并且对应元素都相等,equal() 算法会返回 true。 |
is_permutation | is_permutation() 算法可以用来检查一个序列是不是另一个序列的排列,如果是,会返回 true。 |
search | search() 函数定义在<algorithm> 头文件中,其功能恰好和 find_end() 函数相反,用于在序列 A 中查找序列 B 第一次出现的位置。 |
search_n | 和 search() 一样,search_n() 函数也定义在<algorithm> 头文件中,用于在指定区域内查找第一个符合要求的子序列。不同之处在于,前者查找的子序列中可包含多个不同的元素,而后者查找的只能是包含多个相同元素的子序列。 |
1.2 可变序列算法
copy | 复制序列 |
copy_n | copy_n() 算法可以从源容器复制指定个数的元素到目的容器中 |
copy_if | copy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器 |
copy_backward | 它只会像 copy() 那样复制元素,但是从最后一个元素开始直到第一个元素。 |
move | move() 算法会将它的前两个输入迭代器参数指定的序列移到第三个参数定义的目的序列的开始位置,第三个参数必须是输出迭代器。这个算法返回的迭代器指向最后一个被移动到目的序列的元素的下一个位置。 |
move_backward | 该函数用于按向后顺序移动元素,它接受三个参数,然后移动属于范围[first,last)的元素。元素的移动以相反的顺序开始,终止点为“结果”。 |
swap | swap():交换两个元素。 |
swap_ranges | swap_ranges():交换指定范围的元素。 |
iter_swap | iter_swap():交换由迭代器所指的两个元素。 |
transform | transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。 |
replace | replace() 算法会用新的值来替换和给定值相匹配的元素。 |
replace_if | replace_if() 会将使谓词返回 true 的元素替换为新的值。 |
replace_copy | replace_copy() 算法和 replace() 做的事是一样的,但它的结果会被保存到另一个序列中,而不会改变原始序列。 |
replace_copy_if | 可以在序列中有选择地替换元素的最后一个算法是 replace_copy_if(),它和 replace_if() 算法是相同的,但它的结果会被保存到另一个序列中。 |
fill | fill() 和 fill_n() 算法提供了一种为元素序列填入给定值的简单方式,fill() 会填充整个序列; |
fill_n | fill_n() 则以给定的迭代器为起始位置,为指定个数的元素设置值。 |
generate | generate() 算法只会保存函数为序列中每个元素所返回的值,而且 genemte() 没有任何返回值。 |
generate_n | generate_n() 和 generate() 的工作方式是相似的。不同之处是,它的第一个参数仍然是序列的开始迭代器,第二个参数是由第三个参数设置的元素的个数。 |
remove | remove() 可以从它的前两个正向迭代器参数指定的序列中移除和第三个参数相等的对象。基本上每个元素都是通过用它后面的元素覆盖它来实现移除的。它会返回一个指向新的最后一个元素之后的位置的迭代器。 |
remove_if | remove_if() 可以从前两个正向迭代器指定的序列中移除能够使作为第三个参数的谓词返回 true 的元素。 |
remove_copy | remove_copy() 可以将前两个正向迭代器参数指定的序列中的元素复制到第三个参数指定的目的序列中,并忽略和第 4 个参数相等的元素。它返回一个指向最后一个被复制到目的序列的元素的后一个位置的迭代器。序列不能是重叠的。 |
remove_copy_if | remove_copy_if() 可以将前两个正向迭代器参数指定的序列中,能够使作为第 4 个参数的谓词返回 true 的元素,复制到第三个参数指定的目的序列中。它返回一个指向最后一个被复制到目的序列的元素的后一个位置的迭代器。序列不能是重叠的。 |
unique | unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。 |
unique_copy | Copy range removing duplicates (function template) |
reverse | reverse() 算法可以在原地逆序它的两个双向迭代器参数所指定序列的元素。 |
reverse_copy | reverse_copy() 算法可以将源序列复制到目的序列中,目的序列中的元素是逆序的。 |
rotate | rotate() 算法会从左边选择序列的元素。 |
rotate_copy | rotate_copy() 算法会在新序列中生成一个序列的旋转副本,并保持原序列不变。 |
random_shuffle | 函数random_shuffle()用来对一个元素序列进行随机排序。 |
shuffle | std::shuffle()可以看做是std::random_shuffle的升级版。 |
1.3 分组算法
is_partitioned | 判断一个序列是否被划分为了两个部分,其中一部分满足指定条件,另一部分则不满足。 | ||||
partition | partition 可直译为“分组”,partition() 函数可根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合筛选条件的数据,另一组为不符合筛选条件的数据。 | ||||
stable_partition | partition() 函数只负责对指定区域内的数据进行分组,并不保证各组中元素的相对位置不发生改变。而如果想在分组的同时保证不改变各组中元素的相对位置,可以使用 stable_partition() 函数。 也就是说,stable_partition() 函数可以保证对指定区域内数据完成分组的同时,不改变各组内元素的相对位置。 | ||||
partition_copy | 和 stable_partition() 一样,partition_copy() 函数也能按照某个筛选规则对指定区域内的数据进行“分组”,并且分组后不会改变各个元素的相对位置。更重要的是,partition_copy() 函数不会对原序列做修改,而是以复制的方式将序列中各个元组“分组”到其它的指定位置存储。 | ||||
partition_point | 对于如何在已分好组的数据中找到分界位置,C++ 11标准库提供了专门解决此问题的函数,即 partition_point() 函数。 |
1.4 排序算法
sort | 对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。 |
stable_sort | 和 sort() 函数功能相似,不同之处在于,对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。 |
partial_sort | 从 [first,last) 范围内,筛选出 muddle-first 个最小的元素并排序存放在 [first,middle) 区间中。 |
partial_sort_copy | 从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。 |
is_sorted | 检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。 |
is_sorted_until (first, last) | 和 is_sorted() 函数功能类似,唯一的区别在于,如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。 |
void nth_element (first, nth, last) | 找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。 |
1.5 查找算法
lower_bound | lower_bound() 函数用于在指定区域内查找不小于目标值的第一个元素。也就是说,使用该函数在指定范围内查找某个目标值时,最终查找到的不一定是和目标值相等的元素,还可能是比目标值大的元素。 |
upper_bound | upper_bound() 函数定义在<algorithm> 头文件中,用于在指定范围内查找大于目标值的第一个元素。 |
equal_range | equel_range() 函数定义在<algorithm> 头文件中,用于在指定范围内查找等于目标值的所有元素。 |
binary_search | binary_search() 函数定义在<algorithm> 头文件中,用于查找指定区域内是否包含某个目标元素。 |
1.6 集合算法
merge | merge() 函数用于将 2 个有序序列合并为 1 个有序序列,前提是这 2 个有序序列的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序序列,其排序规则也和这 2 个有序序列相同。 |
inplace_merge | 当 2 个有序序列存储在同一个数组或容器中时,如果想将它们合并为 1 个有序序列,除了使用 merge() 函数,更推荐使用 inplace_merge() 函数。 |
includes | includes() 算法可以比较两个元素的集合,如果第一个集合中的全部元素都来自第二个集合,它会返回 true。如果第二个集合是空的集合,它也返回 true。 |
set_union | 将两个容器的并集存储至新容器,并返回并集中最后1个元素的迭代器位置。 |
set_intersection | 将两个容器的交集存储至新容器,并返回交集中最后1个元素的迭代器位置。 |
set_difference | 将两个容器的差集存储至新容器,并返回差集中最后1个元素的迭代器位置。 |
set_symmetric_difference | 计算两个集合的对称差 |
1.7 堆算法
push_heap | 将新元素插入到堆中 |
pop_heap | 在已有的堆结构中,删除堆顶元素 |
make_heap | 将已有的数据排序,按照堆存储的要求 |
sort_heap | 堆排序,对一个堆结构进行排序。注意,如果没有待排序的数据不是按照堆的形式排序,则会排序失败。 |
is_heap | 判断一个数据队列是否为堆 |
is_heap_until | 判断一个数据队列是否为堆,同时返回第一个不满足堆结构的数据的迭代器 |
1.8 关系算法(最大最小值算法)
min | 返回两个元素中较小一个。重载版本使用自定义比较操作。 |
max | 返回两个元素中较大一个。重载版本使用自定义比较操作。 |
minmax | Return smallest and largest elements (function template) |
min_element | 返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。 |
max_element | 返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。 |
minmax_element | minmax_element()返回第一个最小元素和最后一个最大元素. |
1.9 其他算法
lexicographical_compare | 比较两个序列。重载版本使用用户自定义比较操作。 |
next_permutation | 取出当前范围内的排列,并重新排序为下一个排列。重载版本使用自定义的比较操作 |
prev_permutation | 取出指定范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回false。重载版本使用自定义的比较操作。 |
容器特有的算法:
list容器上的迭代器是双向的,而不是随机访问类型。因此,在此容器上不能使用需要随机访问迭代器的算法。这些算法包括sort及其相关的算法。还有一些其他的泛型算法,如合并,删除,反向和唯一,虽然可以用在列上,但却付出了性能上的代价。如果这些算法利用列表容器实现的特点,则可以更高效地执行。
标准库为list容器定义了更精细的操作集合,使它不必只依赖于泛型操作。
lst.remove_if(func):remove()的_if版本,删除使用func返回真的元素。
参考资料:
https://cplusplus.com/reference/algorithm/
C++ sort()排序函数用法详解