不同于STL其他部件,其余五个都是类模板,但算法是个函数模板。
关于类模板和函数模板的资料,可见:C++学习13:模板的类型和特化
1 引言
由于算法是函数模板,故对于算法而言,每个位置应该是什么类型的参数,一个是有默认值的。如sort:可以是两个迭代器类型的参数,也可以是三个参数的,即增加了比较方式的第三参数。
前面已经知道,算法的功能是“提问”来处理容器的操作,迭代器的功能是完成对算法提问的“回答”。所以迭代器的种类对算法的效率有很大的影响,算法也对迭代器的种类有所暗示,这部分内容见上一节。
2 形式
1、必须在std命名空间中
2、前两个参数必须是两个指针(迭代器)
3、函数和仿函数都可以规定算法的操作。假设myfunc是个函数,myobj重载了小括号,是一个仿函数,他们可以作为第三、第四或其他参数来对算法的操作进行限制。有关仿函数Functor的内容见下一节。
3 示例
3.1 accumulate
功能:将元素累加到init上。从三个参数的版本中可以清晰看出,而下面四个参数的版本可以用函数或仿函数规定一个accumulate的方法。
3.2 for_each
功能:对一段范围的每一个值做某件事情。
3.3 replace
功能:取代,顾名思义,遍历迭代器位置,若值与要取代的值相同,就用新值代替。
命名方式:_if、_copy。replace_if表示如果满足条件pred时替换;replace_copy表示将旧值放至新的区间。
3.4 count
功能计算在一个范围里面符合条件的有多少。
命名方式同上,且有成员函数版本和全局函数版本(左边)。当容器有成员函数版本时,应该用成员函数版本。和count同类的有find和sort等。
3.5 find
功能:循序式的搜寻。
3.6 sort
功能:排序(由小到大)。若要从大到小,可见下图1817行rbegin,rend操作。
对于rbegin,rend,可用下图帮助理解:
关于迭代器适配器reverse_iterator,后面会有讲解。
3.7 binary_search
功能:在排序的前提下进行二分搜寻。
其中,lower_bound和upper_bound表示插入的位置,lower_bound表示能安插的同等的最小的位置,upper_bound表示最大的位置。