算法基于迭代器及其操作实现,而非基于容器操作。这就暗示着,算法也许会修改容器内的元素值,或者在容器内移动元素,但是算法本身从不直接添加或删除元素。理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序。
1 只读算法
a)accumulate
int sum = accumulate(v.begin(),v.end(),23);以23为基数,将v容器中的所有元素累加;
string sum = accumulate(v.begin(),v.end(),string(""));以空字符串开始,将v中的每个字符串连接起来;
注:*accumulate对要处理的容器内元素的类型一无所知,故必须传递一个起始值作为第三个参数,再者,容器内元素类型必须与起始值类型相同或可以转换为起始值的类型。
b)find_first_of(v.begin(),v.end(),v2.begin(),v2.end());在第一个范围内查找与第二个范围内的任一元素像匹配的元素,如果找到,返回一个指向第一个匹配元素的迭代器,否则,返回第 一个范围的end迭代器。
注:*v和v2的容器类型不必相同,只要两个容器内的元素类型可以提供相等操作符(==)即可。
2 写容器算法
使用写容器算法,必须确保容器足以存储要写入的元素。
a)fill(v.begin(),v.end(),t);将指定范围内的元素都设置为给定的值;
b)fill_n(v.begin(),n,t);从指定的位置开始,将指定数量的元素设为给定的值t;
注:*指定范围内的元素必须存在。
c)copy(v.begin(),v.end(),v2.begin());从输入范围中读取元素,然后复制到目标容器中;
d)replace(v.begin(),v.end(),2,1);将指定范围内值为2的元素值替换为1;
e)replace_copy(v.begin(),v.end(),v2.begin(),2,1);不修改v的元素值,v2保存v的副本,并将v2中值为2的用手指替换为1;
3 排序算法
a)sort(v.begin(),v.end());
b)stable_sort(v.begin(),v.end(),sortRule());
c)count_if(v.begin(),v.end(),countRule())
4 迭代器
除了标准库定义的不依赖于特定容器的迭代器之外,还有三种迭代器:插入迭代器,iostream迭代器和反向迭代器。
a)插入迭代器:与容器绑定在一起,可在容器中插入元素。
back_inserter(v);返回一个能在v容器上实现push_back操作的迭代器;
front_inserter(v);返回一个能在v容器上实现push_front操作的迭代器;
注:*只有当容器v提供push_front操作时,才能使用front_inserter。
inserter(v,it);返回一个插入迭代器,该插入迭代器能在容器v上迭代器it所指向的元素前面插入元素。
b)流迭代器:将对应的流看做特定类型的元素序列。
istream_iterator<T> in(strm);创建从流strm中读取T类型对象的istream_iterator对象in;
istream_iterator<T> in;istream_iterator对象的超出末端迭代器;
ostream_iterator<T> out(strm);创建将T类型对象写到输出流strm的ostream_iterator对象out;
ostream_iterator<T> out(strm,delim);创建将T类型对象写到输出流strm的ostream_iterator对象out,在写入过程中用delim作为元素的分隔符,delim为C风格字符串;
注:*流迭代器只定义了最基本的操作:自增、解引用和赋值。此外,可比较两个 istream 迭代器是否相等(或不等),而 ostream 迭代器则不提供比较运算。
*不可能从ostream_iterator中读取,也不可能向istream_iterator中写入;
*一旦给ostream_iterator对象赋了值,就无法再更改,且每个不同的值正好只能输出一次;
*ostream_iterator没有->操作符。
c)反向迭代器:rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置。自增往左,自减往右。[v.begin(),v.end())和[v.rbegin(),v.rend())标示的都是同一范围内的元素,只是起 始位置和结束位置正好相反。