泛型算法不会直接调用容器的操作,而是通过迭代器来访问、修改、移动元素。
1.count
统计某容器内某元素出现次数。第一个参数迭代器为统计的起始地址,第二个参数迭代器为结束地址,第三个指针为被统计元素。
eg: count (vi.begin() , vi.end() , val) //vi为vector
count ( ls.begin(), ls.end() , word) //ls为list
2.accumulate
求某容器内指定范围内元素之和。Accumulate的前两个参数仍然是指定范围的一对迭代器,accumulate的第三个参数是和的初值,它还决定了函数的返回类型,以及函数中使用哪个加法运算符。
eg: accumulate(vi.begin () , vi.end(),0)<<endl;//vi为vector,0表示为int类型加法且初值为0.
accumulate (vd . begin() , vd.end(),0.0);//vd为vector,0表示为double类型加法且初值为0.
3.equal
equal使用==运算符比较两个序列中的元素。string类重载了==,可比较两个字符串是否长度相等且其中元素对位相等。C风格字符串本质是char*类型,用==比较两个char*对象,只是检查两个指针值是否相等,即地址是否相等,而不会比较其中字符是否相同。所以,只有当两个序列中的指针都指向相同的地址时,equal才会返回true。否则,即使字符串内容完全相同,也会返回false。如下面的程序,q中的每个字符串是p中字符串的拷贝,虽然内容相同,但是不同对象指向不同地址,因此equal判定它们不等。而r中每个指针都是p中指针的铂贝,指向相同的地址,因此equal判定它们相等。
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int main(int argc,char *argv[]){
char *p[]= {"Hello","World","!"};
char *q[] ={ strdup(p[0]), strdup(p[1]), strdup(p[2])};
char *r[]= { p[0],p[1], p[2] };
cout << equal (begin(p) , end(p), q)<<endl;
cout << equal (begin (p) , end(p) , r) << endl;
return 0;
}
4.fill_n
fill_n接受一个迭代器,指出起始位置,还接受一个整数,指出设置的元素数目,第三个参数则是要设置的值。
eg:fill_n (vi.begin() , vi.size(), 0);//vi为vector
5.copy
三个参数,前两个为一对指定范围的迭代器,第三个参数为目标容器插入起始地址,也可指定何种方式插入该目标容器。复制某容器内指定范围元素到另一容器内。copy算法通过迭代器对容器进行操作,因此不能直接向/从容器添加、删除元素,无法改变容器大小。copy算法要求目标序列至少要包含与源序列一样多的元素。如需改变容器大小,需要使用一类特殊的称为插入器的迭代器。可以将第三个参数改为 类似于back_inserter(vec)的迭代器,通过它,copy 算法即可将lst中元素的拷贝插入到vec的末尾。注:标准库算法从来不直接操作容器,它们只操作迭代器,从而间接访问容器。能不能插入和删除元素,不在于算法,而在于传递给它们的迭代器是否具有这样的能力。
eg: copy (lst.cbegin (), lst.cend (), vec.begin ());//lst为list,vec为vector.
copy(lst.begin(), lst.end (), back_inserter (vec) ) ;//若vec为定义,仅进行初始化,大小为空,则需要将第三个参数改写为back_inserter (vec)。
6.reserve
为容器分配内存空间。
eg: vector<int> vec; //初始化vec
vec. reserve (10);//为vec分配是个int类型的内存空间