泛型算法:可作用字不同类型的容器和不同类型的元素上。
每个算法都需要使用(至少)两个迭代器来指出该算法操纵的元素范围,第一个迭代器
指向第一个元素,而第二个迭代器则指向最后一个元素的下一位置。第二个迭代器所指向
的元素[有时被称为超出末端迭代器]本身不是要操作的元素,而被用做终止遍历的哨兵。
使用泛型算法必须包含头文件:
#include<algorithm>
#include<numeric>
简单查找算法:
find(beg,end,val)算法返回引用第一个匹配元素的迭代器
count(beg,end,val)算法返回元素在输入序列中出现次数的计数。
写容器元素算法:使用这些算法写元素师要当心,必须确保算法所写的序列至少足以存储要写入的元素。
fill(beg,end,val)在有效的输入范围内,写入val值
copy算法:
ilst是一个存放int型数据的list对象,可如下将它copy给一个vector对象
vector<int> ivec;
copy(ilst.begin(),ilist.end(),back_inserter(ivec));
上面等价于:
vector<int>ivec(ilst.begin().ilst.end());
replace算法:
这个调用将所有的值为0的实例替换成42
replace(ilst.begin(),ilist.end(),0,42);
sort算法:
对vector对象的元素按次序排列
sort(words.begin(),words.end());
unique算法:
该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器,表示无重复的的值范围的结束。
unique实际上并咩有删除任何元素,而是将无重复的元素复制到序列的前端,从而覆盖相邻的重复元素。unique返回的
迭代器指向超出无重复的元素范围末端范围末端的下一个位置。
vector<string>::iterator end_unique=unique(words.begin(),words.end());
erase算法:
这个函数调用从end_unique指向的元素开始删除,直到words的最后一个元素也删掉为止。
words.erase(end_unique,words.end());
谓词:
//指出第一个字符串是否比第二个短
bool isShorter(const string &s1,const string &s2)
{
return s1.size()<s2.size();
}
//判断给出的string对象的长度是否不小于6
bool GT6(const string &s)
{
return s.size()>=6;
}
stable_sort算法:
这个函数调用后,words中的元素按长度大小排序,而长度相同的单词则仍然保持字典顺序。
stable_sort(words.begin(),word.end(),isShorter)
count_if算法:
执行count_if时,首先读取它的头两个实参所标记的范围内的元素,每读出一个元素,就将它传递给第三个实参表示的谓词函数。
vector<string>::size_type wc=count_if(words.begin(),words.end(),GT6);