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