《Thinking in C++> STL算法总结笔记。
STL算法目录
文章目录
0.算法总览
fill()
,为[first, last)每个元素赋值value。fill_n()
,由first开始的n个元素赋值value。generate()
,用发生器为[first, last)的每个元素生成一个值。generate_n()
为first开始的n个元素生成一个值。count()
,范围内等于value的个数。count_if()
,范围内是判定函数为真的个数。copy()
,从[first, last)复制序列到destination。copy_backward()
,反向复制元素。reverse()
,倒置源序列reverse_copy()
,源序列不变,导致结果复制到destination。swap_ranges()
,交换相等大小两个范围的内容rotate()
,把[first, middle)范围元素移到序列末尾,[middle, last)移到序列开始。rotate_copy()
,不改变原始序列,轮换结果复制到destination。next_permutation()
,后继排列prev_permutation()
,前驱排列random_shuffle()
,重新排列元素(混洗)partition()
,将满足判定函数的元素移动到序列开头。stable_partition()
,稳定划分,保持相对位置不变find()
,查找value第一次出现的位置find_if()
,查找使判定函数为真的元素。adjacent_find()
查找两个邻近的相等元素。find_first_of()
,在第二个范围内查找与第一个范围内的某个元素相等的元素。search()
,查找第二个序列第一次出现在第一个序列的位置。find_end()
,查找第二个序列最后一次出现在第一个序列的位置。search_n()
,在范围内查找一组共count个连续的值。min_element()
,最小值首次出现的位置。max_element()
,最大值首次出现的位置。replace()
,旧值替换为新值。replace_if()
,使判定函数为真的值替换为新值。replace_copy()
,不修改原始序列,替换旧值放入result。replace_copy_if()
,不修改原始序列,替换使判定函数为真的值放入result。equal()
,判断两个范围内元素是否完全相同。lexicographical_compare()
,第一个范围是否“字典序小于”第二个范围。mismatch()
,两个范围不匹配的位置。remove()
,删除等于value的元素。remove_if()
,删除使判定函数为真的元素。remove_copy()
,不改变源序列。remove_copy_if()
,不改变源序列。unique()
,删除相邻的相等值(副本)。unique_copy()
,不改变源序列。sort()
,升序排序。stable_sort()
,稳定升序排序。partital_sort()
,对一定元素进行排序,使其有序放入[first, middle)中。partital_sort_copy()
,不改变源序列。nth_element()
,使[first, nth]内所有元素都满足二元判定函数。binary_search()
,告诉value是否出现在有序序列中。lower_bound()
,value第一次出现的位置。upper_bound()
,超越value最后出现的位置。equal_range()
,value第一次和超越最后一次出现的位置。merge()
,升序合并序列。inplace_merge()
,升序合并同一序列的两个范围。includes()
,判断第二个范围是否是第一个范围子集。set_union()
,并集。set_intersection()
,交集。set_difference()
,差。set_symmetric_difference()
,对称差。make_heap()
,建堆。push_heap()
,向[first, last-1)堆中增加元素*(last-1)并放入合适位置。pop_heap()
,将最大元素*first放入位置(last-1)并调整堆。sort_heap()
,堆排序,使堆转为有序序列,不稳定排序。for_each()
,遍历运算,丢弃调用返回值。transform()
,遍历运算,保留调用返回值。accumulate()
,合计。inner_product()
,广义内积。partial_sum()
,广义部分和。adjacent_difference()
,相邻元素差。make_pair()
,两个对象封装为一个对象。distance()
,[first, last)之间的元素个数。back_inserter()
,迭代器。front_inserter()
,迭代器。inserter(),迭代器。
min()
,较小值。max()
,较大值。swap()
,交换a和b。
1.迭代器形式:
- InputIterator。一个只允许单个向序列输入迭代器,前向传递使用operator++和operator*。可以通过operator==和operator!=检测输入迭代器,这是约束的范围。
- OutputIterator。一个只允许单个向序列写入的元素的输出迭代器,前向传递使用operator++和operator*。可以持有无限个对象,不需要结尾检查,可以和ostream(通过ostream_iterator)一起使用,也普遍使用插入迭代器(back_insert()返回的迭代器类型。
- ForwardIterator。仍然仅用operator++前向移动,但是可以同时进行读和写和判断相等。
- BidirectionalIterator。支持ForwardIterator的全部操作,还增加了operator--运算,支持后向移动。
- RandomAccessIterator。支持一个常规指针所做的全部运算:可以通过增加和减少某个整数值,来向前和向后跳跃移动(不是每次只移动一个元素),还可以用operator[]作为下标索引,可以从一个迭代器中减去另一个迭代器,也可以用operator<,operator>来比较迭代器大小。
2.填充和生成
这些算法能够自动用一个特定值来填充(容器中的)某个范围的数据,或为(容器中的)某个特定范围生成一组值。
-
填充(fill):向容器多次插入一个值。
-
生成(generate):使用发生器来产生插入到容器的值。
3. 计数
所有容器都含有一个成员函数size()
,它可以告诉该容器包含多少个元素。size()
的返回类型是迭代器的difference_type(通常是ptrdiff_t)。
-
计数(count):对满足一定标准的对象计数
4. 操作序列
-
移动序列(copy):
-
翻转(reverse):
-
交换(swap):
-
轮换(rotate):
-
排列(permutation):
排列是一组元素的一种独一无二的排序,如果有n个元素,则有n!中不同的元素组合。这些组合概念化地以词典编纂(类似字典)的顺序排序,就产生了前驱(previous)和后继(next)排列的概念。
-
混洗(shuffle):
-
划分(partition):
5. 查找和替换
这些算法用来在某个范围内查找一个或多个对象,该范围由两个迭代器参数定义。
-
查找(find):
-
替换(replace):
6. 比较范围
以下算法提供比较两个范围的方法。
-
比较:
7. 删除元素:
STL“删除”函数重新排列该序列,将“已被删除的”元素排在序列的末尾,“未删除的”排在序列的开头,返回一个指向序列的“新末尾”元素的迭代器(不包含删除元素的序列的末尾)。
如果new_last是删除函数返回的迭代器,则范围[first, new_last)是不包含任何被删除元素的序列,而范围[new_last, last)是被删除元素组成的序列。
-
删除(remove):
-
去重(unique):
8. 对已排序的序列进行排序和运算
STL提供了大量独立的排序算法,分别对应于稳定的、部分的或仅是规则的(不稳定)排序。只有部分排序有复制的版本。
对已排好序的序列进行包括排序或运算的每个算法都有两种版本。第一种使用对象自己的operator<来执行比较,第二种使用operator()(a, b)来决定a和b的相对顺序。
-
排序(sort):
-
有序序列查找:
-
合并有序序列(merge):
-
集合运算:
9. 堆运算
标准库中的堆运算允许一个序列被视为是一个”堆“数据结构,可以高效的返回最高优先权的元素,而无需全部排序整个序列。
优先权是依据某些比较函数决定的。第一种版本通过operator<执行比较,第二种版本使用StrictWeakOrdering对象的operator()(a, b)来比较两个对象:a<b。
-
堆(heap):
10. 对某一范围内的所有元素进行运算
这些算法遍历整个范围并对每个元素执行运算。
-
遍历运算:
11. 数值算法
这些算法包含在头文件 <numeric>中,主要用来执行数值计算。
-
合计:
-
内积:
广义部分和:
第二种版本使用二元函数op代替+运算符,取得积累到那个点的所有的“合计”,并于新值结合起来。
返回值指向输出范围[result, result+(last-first) )的末尾。
相邻元素差:
第二种形式使用二元函数op代替‘-’运算符执行“求差”。
返回值指向输出范围[result, result+(last-first) )的末尾。
12. 基本工具
和其他算法一起使用的一些基本工具。
-
pair:
-
元素个数:
-
创建迭代器:
-
较小值:
-
较大值:
-
交换: