2016/12/08C++Primer学习笔记:第十章 泛型算法

来源:互联网 发布:淘宝网店货源供应商 编辑:程序博客网 时间:2024/06/12 11:06

标准库提供了一些经典算法的公共接口,如搜索和排序,它们可用于不同类型的元素和多种容器类型。

10.1概述
大多数算法都定义再头文件algorithm中。
find(vec.cbegin(),vec.cend(),val),寻找两个迭代器之间的所有元素中与val第一个相等的值,并返回指向这个元素的迭代器。
10.2
10.2.1只读算法
accumulate()接受三个参数,前两个位需要求和的元素的范围,第三个为和的初值。
其中有个假定,元素类型要有对应的“+”操作如:
string sum=accumulate(v.cbegin(),v.cend(),string(“”))
此条语句会将v中的所有string元素连接起来并赋值给sum;

操作两个序列的算法    equal()将第一个序列中的所有元素与第二个序列中的对应元素进行比较,都相等则返回一个true;    它接受三个参数,前两个为第一个序列的范围,最后一个为第二个序列的首元素           注意:两个序列的元素类型可以不一样,如第一个序列为string,第二个序列为char*,但第二个序列至少和第一个序列一样长

10.2.2写容器元素的算法
算法不能改变容器大小
如:
fill()接受三个参数,前两个为元素范围,第三个为元素值,此函数将范围内的所有元素替换为第三个参数的元素值

算法不检查写操作

fill_n(vec.begin(),vec.size(),0);//将所有元素置为0
错误:fill_n(vec.begin(),10,0);//vec本来是空的,也就是说fill_n不检查容器大小是否足够

插入迭代器:将一个新的元素插入到容器中
back_inserter()
例:auto it=back_inserter(vec);
*it=42;
在此例中我们能通过it将值42插入到容器中,等同于调用push_back();

拷贝算法
copy()接受三个参数,前两个为输入元素范围,第三个为输出元素范围。返回一个指向拷贝的最后一个元素之后的迭代器。
replace(list.begin(),list.end(),0,42);//将list中所有的0改为42
replace_copy(list.cbegin(),list.cend(),back_inserter(vec),0,42)//将替换后的序列存入vec,并不更改list中的元素。

10.2.3重排容器元素的算法
sort()接受两个参数,重排范围内的元素。由小到大排列。
end_unique()接受量迭代器参数,两个迭代器范围内的元素中重复出现的排在序列末。返回无重复元素序列之后的第一个迭代器。

10.3定制操作

重载的sort(),接受第三个参数,此参数是一个谓词。

谓词
一元谓词:接受一个参数;二元谓词:接受两个参数。
接受谓词参数的算法对输入序列中的元素调用谓词,以此元素类型必须能转换为谓词的参数类型。

0 0