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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++STL算法系列3---求和:accumulate
该算法在numeric头⽂件中定义。

假设vec是⼀个int型的vector对象,下⾯的代码:
//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算法返回累加的结果,其返回类型就
是其第三个实参的类型。

⽤于指定累加起始值的第三个参数是必要的,因为accumulate对将要累加的元素类型⼀⽆所知,除此之外,没有别的办法创建合适的起始值或者关联的类型。

accumulate对要累加的元素类型⼀⽆所知,这个事实有两层含义。

⾸先,调⽤该函数时必需传递⼀个初始值,否则,accumulate将不知道使⽤什么初始值。

其次,容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。

在accumulate内部,第三个实参⽤作累加的起点;容器内的元素按顺序连续累加到综合之中。

因此,必须能够将元素类型加到总和类型上。

假定V是vector<double>类型的对象,则调⽤accumulate<v.begin() , v.end() , 0>是否有错?如果有的话,错在哪⾥?
从函数调⽤上看没有错误。

调⽤accumulate函数必须满⾜的条件包括:容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。

上述调⽤中的第三个实参为int类型,⽽vector对象中的元素的类型为double类型,可以转换为int类型。

但计算的结果不准确。

因为将double类型转换为int类型会截去⼩数部分,得到的求和结果是各元素的整数部分的和,是⼀个int类型的值,与实际的元素值总和相⽐会有⽐较⼤的误差。

考虑下⾯的例⼦,可以使⽤accumulate把string型的vector容器中的元素连接起来:
//concatenate elements from V and store in sum
string sum = accumulate(v.begin() , v.end() , string(""));
这个函数调⽤的效果是:从空字符串开始,把vec⾥的每个元素连接成⼀个字符串。

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

1//读取⼀系列int型数据,并将它们存储到vector对象中,
2//然后使⽤algorithm头⽂件中定义的名为accumulate的函数,
3//统计vector对象中的元素之和
4 #include<iostream>
5 #include<vector>
6 #include<numeric>
7using namespace std;
8
9int main()
10 {
11int ival;
12 vector<int> ivec;
13
14//读⼊int型数据并存储到vector对象中,直⾄遇到⽂件结束符
15 cout<<"Enter some integers(Ctrl+z to end): "<<endl;
16while(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
24return0;
25 }。

相关文档
最新文档