zoukankan      html  css  js  c++  java
  • STL源码剖析之六:算法

    stl提供了很多泛型算法,基本涵盖了一般程序所能应用到的所有算法。本篇以目录式的方式,介绍stl的包含的算法。在以后的编程实践中,如果遇到相似的问题,应该参考stl的算法代码。

    数值算法

    1、T accumulate(InputIterator first, InputIterator last, T init)

    累加,该算法要求提供一个明确的初始值init,原因是这样可以确保当first和last之间没有元素时,函数的返回值是确定的。

    2、OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result)

    计算相邻元素的差值,保存在result开始的序列中。第一个位置,即result处,保存的就是first的值。

    3、T inner_product(InputIterator first1, InputIterator last1,InputIterator first2, InputIterator last2, T init);

    内积

    4、OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result)

    计算相邻元素的和值,将*first赋给*resut,(*first+*(first+1))赋值给*(result+1),以此类推。该操作和adjacent_difference互为逆操作

    5、T power(T x, integer n)

    幂运算,该算法的实现使用技巧,提升求幂的效率为(lgn)。

    Set算法

    这部分算法不适用于hash_table,hash_set这样的容器。

    1、set_union

    并集

    2、set_intersection

    交集

    3、set_difference

    差集

    4、set_symmetric_difference

    对称差集

    heap算法

    1、make_heap

    2、push_heap

    3、pop_heap

    4、sort_heap

    其他算法

    1、adjacent_find

    需找满足条件的相邻元素

    2、count

    计算等于某个值的元素个数

    3、count_if

    计算满足某个条件的元素个数

    4、find

    寻找第一个等于某个值的元素

    5、find_if

    寻找第一个满足某个条件的元素

    6、find_end

    ForwardIterator find_end(ForwardIterator first1, ForwardIterator last1,ForwardIterator first2, ForwardIterator last2);

    寻找[first1,last1)所涵盖的区间中,查找序列[first2,last2)最后出现的点。

    7、find_first_of

    和6类似,寻找第一次出现的点

    8、includes

    bool includes(InputIterator first1,InputIterator last1, Inputterator first2,InputIterator last2)

    判断序列1是否涵盖序列2,相当于集合的包含。

    9、merg

    合并两段有序序列

    10、partition

    将区间的元素重排,满足某个条件的被置于区间的前端,否则被置于区间的后段。该算法不保证元素的原始相对位置。

    11、remove

    移除区间内某个值的元素

    12、replace

    void replace(ForwardIterator first,ForwardIterator last, const T& old_value, const T& new_value);

    将区间内的元素所有的old_value,替换为new_value

    13、replace_if

    14、reverse

    将序列重排

    15、rotate

    void rotate(ForwardIterator first,ForwardIterator middle, ForwardIterator last)

    将[first, middle)和[middle,last)内的元素互换,无论这两段长度是否一致。

    16、unique

    移除相邻,相等的元素

    17、lower_bound

    应用于有序区间,二分查找的一种版本,返回“不破坏排序状态下第一个可插入value的位置。

    18、upper_bound

    与lower_bound类似,返回”不破坏排序状态下,最后一个可插入value的位置“;

    19、binary_search

    二分查找,返回true或false,指示有序序列中是否包含value。该算法实际上是基于17或18实现的。

    20、next_permutation

    首先说明一下什么事“下一个排列”和“前一个排列”。考虑(a,b,c)三个字符组成的排列:abc,acb,bac,bca,cab,cba,这个六个排列是按less than做字典排序的。那么abc的下一个排列就是acb,没有前一个序列;cba的前一个序列是cab,没有下一个排列。next_permutation(first,last)返回[first,last)所表示之排列的下一个排列。

    算法描述如下:从序列的尾端往前寻找两个相临的元素,第一个为i,第二个为ii,且满足*i<*ii。找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j。将*i与*j对调,再将ii之后(包括ii)所有元素颠倒排列。所得序列即下一个排列。

    21、prev_permutation

    与next_permutation对应,算法描述如下:从序列的尾端往前寻找两个相临的元素,第一个为i,第二个为ii,且满足*i>*ii。找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个小于*i的元素,令为*j。将*i与*j对调,再将ii之后(包括ii)所有元素颠倒排列。所得序列即下一个排列。

    22、random_shuffle

    将[first,last)的元素随机重排。该算法描述如下:从first开始遍历列表,将当前元素*i随机地与[first,i]之间的某个元素交换位置。

    23、partial_sort

    本算法使[first,last)k个最小元素以递增顺序位于[first,first+k)内。相对于将整个序列排序来说,该算法的效率要高。算法的描述如下:在[first,first+k)建立起一个最大堆,然后依次检查[first+k,last)之间的元素,如果某元素比最大堆的最大元素大就忽略,否则进行交换,并重新保持最大堆特性。这样当遍历结束后,最小的k个元素已经位于[first,first+k),在对这个区间进行一次堆排序就OK了。

  • 相关阅读:
    【pytest学习10】fixture参数化,fixture(params=data)装饰器的data是函数返回值yield request.param ,将带到下面调用为参数的函数中
    Pipfile 文件转换利器——pipfile-freeze
    npm的lock
    调试wmi连接主机进行监控
    RPC电源监控总结
    HTTP协议三次握手过程
    linux常用命令集
    Gym
    Gym
    实验2.2
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423349.html
Copyright © 2011-2022 走看看