0
点赞
收藏
分享

微信扫一扫

《Thinking in C++》笔记:STL算法

干自闭 2022-01-24 阅读 65

《Thinking in C++> STL算法总结笔记。

STL算法目录

文章目录

0.算法总览

  1. fill(),为[first, last)每个元素赋值value。
  2. fill_n(),由first开始的n个元素赋值value。
  3. generate(),用发生器为[first, last)的每个元素生成一个值。
  4. generate_n()为first开始的n个元素生成一个值。
  5. count(),范围内等于value的个数。
  6. count_if(),范围内是判定函数为真的个数。
  7. copy(),从[first, last)复制序列到destination。
  8. copy_backward(),反向复制元素。
  9. reverse(),倒置源序列
  10. reverse_copy(),源序列不变,导致结果复制到destination。
  11. swap_ranges(),交换相等大小两个范围的内容
  12. rotate(),把[first, middle)范围元素移到序列末尾,[middle, last)移到序列开始。
  13. rotate_copy(),不改变原始序列,轮换结果复制到destination。
  14. next_permutation(),后继排列
  15. prev_permutation(),前驱排列
  16. random_shuffle(),重新排列元素(混洗)
  17. partition(),将满足判定函数的元素移动到序列开头。
  18. stable_partition(),稳定划分,保持相对位置不变
  19. find(),查找value第一次出现的位置
  20. find_if(),查找使判定函数为真的元素。
  21. adjacent_find()查找两个邻近的相等元素。
  22. find_first_of(),在第二个范围内查找与第一个范围内的某个元素相等的元素。
  23. search(),查找第二个序列第一次出现在第一个序列的位置。
  24. find_end(),查找第二个序列最后一次出现在第一个序列的位置。
  25. search_n(),在范围内查找一组共count个连续的值。
  26. min_element(),最小值首次出现的位置。
  27. max_element(),最大值首次出现的位置。
  28. replace(),旧值替换为新值。
  29. replace_if(),使判定函数为真的值替换为新值。
  30. replace_copy(),不修改原始序列,替换旧值放入result。
  31. replace_copy_if(),不修改原始序列,替换使判定函数为真的值放入result。
  32. equal(),判断两个范围内元素是否完全相同。
  33. lexicographical_compare(),第一个范围是否“字典序小于”第二个范围。
  34. mismatch(),两个范围不匹配的位置。
  35. remove(),删除等于value的元素。
  36. remove_if(),删除使判定函数为真的元素。
  37. remove_copy(),不改变源序列。
  38. remove_copy_if(),不改变源序列。
  39. unique(),删除相邻的相等值(副本)。
  40. unique_copy(),不改变源序列。
  41. sort(),升序排序。
  42. stable_sort(),稳定升序排序。
  43. partital_sort(),对一定元素进行排序,使其有序放入[first, middle)中。
  44. partital_sort_copy(),不改变源序列。
  45. nth_element(),使[first, nth]内所有元素都满足二元判定函数。
  46. binary_search(),告诉value是否出现在有序序列中。
  47. lower_bound(),value第一次出现的位置。
  48. upper_bound(),超越value最后出现的位置。
  49. equal_range(),value第一次和超越最后一次出现的位置。
  50. merge(),升序合并序列。
  51. inplace_merge(),升序合并同一序列的两个范围。
  52. includes(),判断第二个范围是否是第一个范围子集。
  53. set_union(),并集。
  54. set_intersection(),交集。
  55. set_difference(),差。
  56. set_symmetric_difference(),对称差。
  57. make_heap(),建堆。
  58. push_heap(),向[first, last-1)堆中增加元素*(last-1)并放入合适位置。
  59. pop_heap(),将最大元素*first放入位置(last-1)并调整堆。
  60. sort_heap(),堆排序,使堆转为有序序列,不稳定排序。
  61. for_each(),遍历运算,丢弃调用返回值。
  62. transform(),遍历运算,保留调用返回值。
  63. accumulate(),合计。
  64. inner_product(),广义内积。
  65. partial_sum(),广义部分和。
  66. adjacent_difference(),相邻元素差。
  67. make_pair(),两个对象封装为一个对象。
  68. distance(),[first, last)之间的元素个数。
  69. back_inserter(),迭代器。
  70. front_inserter(),迭代器。
  71. inserter(),迭代器。
  72. min(),较小值。
  73. max(),较大值。
  74. swap(),交换a和b。

1.迭代器形式:

  1. InputIterator。一个只允许单个向序列输入迭代器,前向传递使用operator++和operator*。可以通过operator==和operator!=检测输入迭代器,这是约束的范围。
  2. OutputIterator。一个只允许单个向序列写入的元素的输出迭代器,前向传递使用operator++和operator*。可以持有无限个对象,不需要结尾检查,可以和ostream(通过ostream_iterator)一起使用,也普遍使用插入迭代器(back_insert()返回的迭代器类型。
  3. ForwardIterator。仍然仅用operator++前向移动,但是可以同时进行读和写和判断相等。
  4. BidirectionalIterator。支持ForwardIterator的全部操作,还增加了operator--运算,支持后向移动。
  5. 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:

    • 元素个数:

    • 创建迭代器

    • 较小值:

    • 较大值

    • 交换

    举报

    相关推荐

    0 条评论