find算法
find可以接受一组迭代器范围和一个要搜索的值,算法进行值的比对,如果有返回第一个值的迭代器,如果没有返回形参的第二个迭代器
算法通过迭代器进行访问,不依赖于特定的容器,从而实现泛用。算法不会执行容器操作的特性带来了一种编程假定:算法不会改变底层容器的大小,算法可能会修改和移动元素,但是不会添加和删除

只读算法
只读取元素而不改变元素
accumulate:定义在头文件numeric中,可以计算一组迭代器范围内元素的和,第三个参数是附加值,一般设为0,用来决定函数中使用哪个加法运算符和返回值的类型,想要调用此算法要确保容器内元素可以进行加操作

string sum = accumulate(v.cbegin(),v.cend(),string(""));//构建一个匿名string对象显式的说明调用string类型的加运算,此处要使用string而不能是直接"",这样构建的类型是const char*,它没有自己的加运算,将产生编译错误

equal:用于确定两个序列的值是否相同,接受三个迭代器,前两个为比较的范围,最后一个是第二个序列的比较首元素位置。由于equal的算法特性,只要支持==运算就可以进行比较,而不强求容器和元素类型相同
(练习10.5)

写容器元素的算法
fill:接受一组迭代器和一个值,向容器内写入元素
fill_n:接受一个迭代器,一个计数值和一个值,将值赋给迭代器后面计数值个元素

插入迭代器初识:back_inserter
使用插入迭代器可以保证容器内有足够空间容纳输出数据,插入迭代器可以向容器内添加元素。一般情况下添加元素的实质是给迭代器指向的元素赋值,而当使用插入迭代器时,会产生一个和赋值右侧值相等的元素添加到容器,在后面将详细分析插入迭代器
back_inserter:定义在iterator中,接受一个指向容器的引用,返回一个与容器绑定的插入迭代器,使用此迭代器赋值时,会调用push_back将元素添加到容器

vector<int>  vec;
fill_n(back_inserter(vec), 10, 0);//添加十个元素到vec

拷贝算法
接受三个迭代器,前两个为输入范围,最后一个为目标的起始容器
copy:基本拷贝函数,返回拷贝结束后目标容器最后一个元素的迭代器
replace:将指定值替换为新值,接受四个参数,前两个为迭代器范围,第三个是要搜索的值,最后一个是新值
replace_copy:接受第三个迭代器,将输出结果输出到第三个迭代器指定的容器中,原序列不变
(练习10.7)

重排容器元素的算法
案例-消除重复单词:首先使用sort进行排序,sort会调用小于运算符使相同的单词相邻,排序后用unique算法重拍,,使得不重复的出现在前面,由于算法不能进行容器操作,最后使用erase删除

void elimDups(vector<string> &words)
{
    sort(words.begin(),words.end());
    auto end_unique = unique(words.begin(),words.end());//使用unique算法,使得每个单词只出现一次,排列在范围的前端,返回指向不重复区域之后位置的迭代器
    words.erase(end_unique, words.end());
}