C++_STL源码阅读:算法篇 Algorithms


源码路径:STLport-5.2.1/stlport/stl

numeric:

  • accumalate
  • inner_product
  • partial_sum
  • adjacent_differnence: 相邻两个元素之间的差值or加法
  • power:计算x的n次方
  • iota:并非属于STL,只是一个扩展,是的某个指定区间,从指定值_val开始逐元素递增

其中,power算法可以简单讨论下:

  • 方法1: 循环n次,x连乘,但这样比较低效, log(n)
  • 方法2: 二分,递归,但栈溢出
  • 方法3: 如STL实现,是对方法2的非递归写法;其中,n每次迭代后减半


algobase

  • 交换元素:swap | swap_aux
  • min | max: 针对2个元素
  • copy | copy_trival | copy_backward | copy_n
  • fill 用特定元素val填充某个指定区间 fill_fwd | fill_n
  • equal | mismatch 确定l1和l2是否相等;或者不匹配的第一个点
  • lexicographical_compare | lexicographical_compare  按字典序比较l1和l2
  • 查找系列: find | find_if | find_first_of
  • replace 原地替换更新元素值

algo:

  • for_each 迭代遍历
  • count_if
  • adjacent_find 相邻两个相等元素的查找
  • 查找系列:find_first_of search_n  
  • swap_ranges
  • transform
  • replace | replace_if | replace_copy | replace_copy_if
  • generate | generate_n
  • 删除系列: remove | remove_copy | remove_if | remove_copy_if 注意,执行后内存未释放,只是把未删除元素compact提前了,即last指针前移,末尾几个元素还是占用了空间,即vector.size不变
  • unique | unique_copy
  • reverse | rotate | reverse_copy
  • random系列,数据shuffle用:random_sample | random_shuffle
  • partition 这是为了快速排序做准备的func,即“划分排序”是用到划分嘛
  • sort  partial_sort 见下面
  • merge | merge_sort 归并排序


set:

  • set_union 取并集
  • set_intersection 取交集
  • set_difference 差集
  • set_symmetric_difference   A并B-A交B

排列组合:

  • next_permutation 返回bool
  • prev_permutation


heap:

  • is_heap

other:



二分查找:

  • lower_bound:第一个出现的位置,也即位置的下界
  • upper_bound:最后出现的位置,也即位置的上界
  • equal_range:基于lower_bound,返回查找的目标区间
  • binary_search : 基于lower_bound,返回是否存在,bool|false


Sort:

  • partial_sort 划分排序,就是快速排序; 怎么选pivot呢?采用median-of-three方法,即开头、中间、结尾三个元素,值大小处于中间的那个。
  • insert_sort:元素较少时或者大部分有序时,效率较高;
  • introspective_sort:1996,David R. Musser提出;可以自适应地从partial_sort切换到heap_sort;


Merge:归并排序


排列组合:

  • next_permutation:直接在输入的vector原地生成新的排列组合;如果没有新的生成,返回false;
  • pre_permutation




你可能感兴趣的:(C++)