前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ STL算法系列3---求和:accumulate

C++ STL算法系列3---求和:accumulate

作者头像
猿人谷
发布2018-01-17 15:46:12
2.4K0
发布2018-01-17 15:46:12
举报
文章被收录于专栏:猿人谷猿人谷

 该算法在numeric头文件中定义。

假设vec是一个int型的vector对象,下面的代码:

代码语言:javascript
复制
//sum the elements in vec starting the summation with the value 42
int sum = accumulate(vec.begin() , vec.end() , 42);

将sum设置为vec的元素之和再加上42。

accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值

accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值。accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型

代码语言:javascript
复制
用于指定累加起始值的第三个参数是必要的,因为accumulate对将要累加的元素类型一无所知,除此之外,没有别的办法创建合适的起始值或者关联的类型。

accumulate对要累加的元素类型一无所知,这个事实有两层含义。首先,调用该函数时必需传递一个初始值,否则,accumulate将不知道使用什么初始值。其次,容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。在accumulate内部,第三个实参用作累加的起点;容器内的元素按顺序连续累加到综合之中。因此,必须能够将元素类型加到总和类型上。

代码语言:javascript
复制
假定V是vector<double>类型的对象,则调用accumulate<v.begin() , v.end() , 0>是否有错?如果有的话,错在哪里?

从函数调用上看没有错误。 调用accumulate函数必须满足的条件包括:容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。上述调用中的第三个实参为int类型,而vector对象中的元素的类型为double类型,可以转换为int类型。

但计算的结果不准确。因为将double类型转换为int类型会截去小数部分,得到的求和结果是各元素的整数部分的和,是一个int类型的值,与实际的元素值总和相比会有比较大的误差。

考虑下面的例子,可以使用accumulate把string型的vector容器中的元素连接起来:

代码语言:javascript
复制
//concatenate elements from V and store in sum
string sum = accumulate(v.begin() , v.end() , string(" "));

这个函数调用的效果是:从空字符串开始,把vec里的每个元素连接成一个字符串。

下面让我们用一个具体事例来说明:用accumulate统计vector<int>容器对象中的元素之和。

代码语言:javascript
复制
 1 //读取一系列int型数据,并将它们存储到vector对象中,
 2 //然后使用algorithm头文件中定义的名为accumulate的函数,
 3 //统计vector对象中的元素之和
 4 #include<iostream>
 5 #include<vector>
 6 #include<numeric>
 7 using namespace std;
 8 
 9 int main()
10 {
11     int ival;
12     vector<int> ivec;
13 
14     //读入int型数据并存储到vector对象中,直至遇到文件结束符
15     cout<<"Enter some integers(Ctrl+z to end): "<<endl;
16     while(cin >> ival)
17         ivec.push_back(ival);
18 
19     //使用accumulate函数统计vector对象中的元素之和并输出结果
20     cout<<"summation of elements in the vector: "
21         <<accumulate(ivec.begin() , ivec.end() , 0)  //统计vector对象中的元素之和
22         <<endl;
23 
24     return 0;
25 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-08-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档