现在的位置: 首页 > 综合 > 正文

STL源码剖析之六:算法

2013年04月11日 ⁄ 综合 ⁄ 共 2765字 ⁄ 字号 评论关闭

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了。

 

 

抱歉!评论已关闭.