第十二章 泛型算法 (上)

在使用标准库当中的算法时,记得要包含#include<algorithm>头文件,在学习算法的时候个人感觉主要了解到算法实现的功能和他所需要的参数即可使用算法了。

下面主要介绍课本中提到的标准库算法

1.只读算法:find和accumulate算法(该算法在#include<numeric>头文件中)。accumulate(vec.begin(),vec.end(),value)是将容器中所有的元素累加,并且加上处置value。函数带有三个参数,头两个参数指定累加的范围,最后一个参数指定累加的初值。

标准库也定义了find_first_of算法(类似于string中的find算法一样),该算法是带有两对迭代器参数来标记两段元素的范围,在第一段元素的范围内查找第二段元素中任意元素匹配的元素,然后返回一个迭代器,指向在第一段范围内第一个匹配的元素。如果找不到,则返回第一段范围的end迭代器。如

list<string>::iterator it=find_first_of(ilist.begin(),ilist.end(),ilist1.begin(),ilist1.end());

2.写入元素的算法:将输入序列写入容器中,fill算法和fill_n算法,copy算法以及算法的_copy版本

fill(vec.begin(),vec.end(),value)fill算法带有三个参数,头两个是一对迭代器,用于指定要写入的范围,而所写的值是它的第三个参数value。即将该范围内所有的元素都设为value。

fill_n(vec.begin(),occur,value)fill_n算法带有两个参数,第一个是一个迭代器用来指定开始要写入的位置,第二个是一个计数器,用来指定写入元素的个数,第三个则是用来写入的值,即将occur个value从迭代器标记的开始的位置开始写入。

注意:这里有一个问题需要注意一下,就是在写入的目标容器中不能为空,如果为空就会出错,在这个情况下我们可以采用插入迭代器来解决这个问题,即back_inserter()

copy(vec.begin(),vec.end(),back_inserter(vec1)),copy算法带有三个迭代器参数,头两个是指定输入范围,第三个是指向目标序列的一个元素,即是将输入范围的元素复制到从指定位置的迭代器开始的目标当中。

算法的_copy版本  是将相应范围的元素复制到另一个各容器当中去,并且可以做相应的改变

如:replace_copy(vec.begin(),vec.end(),back_insert(vec1),value1,value2); 该算法带有五个参数,算法的功能是将头两个迭代器参数指定的范围的元素,复制到通过插入迭代器的方式的容器中,在复制的过程中,如果遇到有value1的值得时候就用value2来替换。

3.对元素的排序算法:

sort算法:sort(vec.begin(),vec.end())sort算法带有两个迭代器参数,就是用来指定需要排序的范围,即将该范围的元素按照字典或者小于的顺序排序。

unique算法:unique(vec.begin(),vec.end())unique算法带有两个迭代器参数,用来指定元素的范围,功能是将范围内的元素中删除相邻重复的元素,然后重新排列输出范围内的元素,并且返回一个迭代器,指向无重复的值范围的结束位置(即最后一个无重复元素的下一个位置)。注意:unique算法并没有真正删除重复的元素,只是把无重复的元素复制到序列的前端,从而覆盖了相邻的元素

4.需要用到谓词函数的的算法

(1)排序算法:stable_sort(vec.begin(),vec.end(),isShorter)stable_sort算法带有三个参数,前两个是迭代器参数,用来指定排序的范围,isShorter是谓词函数,为此函数返回一个bool类型的值,用来判断是否满足谓词函数,即按照谓词函数来排序。

count_if(vec.begin(),vec.end(),Gt6)count_if算法带有三个参数,头两个是迭代器参数,用来指定需要统计元素的范围,Gt6是谓词函数。即按照谓词函数来统计。此算法返回一个size_type的类型值,表示满足条件的个数。