stl容器之泛型算法--count、accumulate、equal、fill_n、copy、reserve

4 篇文章 0 订阅

泛型算法不会直接调用容器的操作,而是通过迭代器来访问、修改、移动元素。

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类型的内存空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

What’smean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值