《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: 
-  元素个数: 
-  创建迭代器: 
-  较小值: 
-  较大值: 
-  交换: 










