C++ STL算法之accumulate函数

1. 介绍

  用来计算特定范围内(包括连续的部分和初始值)所有元素的和,除此之外,还可以用指定的二进制操作来计算特定范围内的元素结果。其头文件在numeric中。

  accumulate原函数声明定义如下:

  

template<class InputIterator, class Type>
   Type accumulate(
      InputIterator _First,
      InputIterator _Last,
      Type _Val
   );
template<class InputIterator, class Type, class Fn2>
   Type accumulate(
      InputIterator _First,
      InputIterator _Last,
      Type _Val,
      BinaryOperation _Binary_op
   );

参数说明。

参数 描述
_First 指定范围内第一个迭代的值或者结合操作选项使用。
InputIterator _Last 指定范围内最后一个迭代值或者结合操作项使用。
_Val 要计算的初始值。
_Binary_op 运用于指定范围内所有元素和前面计算得到结果的参数。

但看说明也许不太容易懂,我们通过例子更具体的解释下这个函数。

2. 应用举例

#include <vector>
#include <numeric>
#include <functional>
#include <iostream>

using namespace std;

int main( )
{

   vector <int> v1, v2( 20 );
   vector <int>::iterator Iter1, Iter2;

   int i;
   for ( i = 1 ; i < 21 ; i++ )
   {
      v1.push_back( i );
   }

   cout << "最初向量v1中个元素的值为:\n ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // accumulate函数的第一个功能,求和
   int total;
   total = accumulate ( v1.begin ( ) , v1.end ( ) , 0 );

   cout << "整数从1到20的和为: "
        << total << "." << endl;

   // 构造一个前n项和的向量
   int j = 0, partotal;
   for ( Iter1 = v1.begin( ) + 1; Iter1 != v1.end( ) + 1 ; Iter1++ )
   {
      partotal = accumulate ( v1.begin ( ) , Iter1 , 0 );
      v2 [ j ] = partotal;
      j++;
   }

   cout << "前n项和分别为:\n ( " ;
   for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
      cout << *Iter2 << " ";
   cout << ")." << endl << endl;

   // accumulate函数的第二个功能,计算连乘积
   vector <int> v3, v4( 10 );
   vector <int>::iterator Iter3, Iter4;

   int s;
   for ( s = 1 ; s < 11 ; s++ )
   {
      v3.push_back( s );
   }

   cout << "向量v3的初始值分别为:\n ( " ;
   for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
      cout << *Iter3 << " ";
   cout << ")." << endl;

   int ptotal;
   ptotal = accumulate ( v3.begin ( ) , v3.end ( ) , 1 , multiplies<int>( ) );

   cout << "整数1到10的连乘积为: "
        << ptotal << "." << endl;

   // 构造一个前n项积的向量
   int k = 0, ppartotal;
   for ( Iter3 = v3.begin( ) + 1; Iter3 != v3.end( ) + 1 ; Iter3++ ) {
      ppartotal = accumulate ( v3.begin ( ) , Iter3 , 1 , multiplies<int>( ) );
      v4 [ k ] = ppartotal;
      k++;
   }

   cout << "前n项积分别为:\n ( " ;
   for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ )
      cout << *Iter4 << " ";
   cout << ")." << endl;
}

编译运行,看一下输出结果:

时间: 2024-11-03 01:43:14

C++ STL算法之accumulate函数的相关文章

STL算法设计理念 - 二元函数,二元谓词以及在set中的应用

demo 二元函数对象 #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; template <typename T> class SumVector { public: T operator()(T t1, T t2) // 二元函数对象 { return t1 + t2; } protected: p

仿函数(函数对象)和STL算法

1仿函数可当作排序准则 程序员经常将某些class obect以有序的形式置于容器中或许你是 不能或不想反正你无法使用一般的operator<来对这些对象排序,你必须以某种特别规则通常基于某些成员函数此时仿函数派上用场例如: Class Person { Public: String firstname() const; String lastname() const; } Class personsortCriterion { Bool operator()(const Person& p

STL算法设计理念 - 函数对象和函数对象当參数和返回值

函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)"的方式使用一个类对象,假设没有上下文,全然能够把它看作一个函数对待. 这是通过重载类的operator()来实现的. "在标准库中.函数对象被广泛地使用以获得弹性".标准库中的非常多算法都能够使用函数对象或者函数来作为自定的回调行为: demo #include <iostr

c++ 提高4 map容器 共性机制 使用时机 比较| STL算法 算法基础仿函数 谓词 函数适配器 遍历算法

[本文谢绝转载] <大纲> STL 容器 map 容器的4中初始化 遍历 map容器 元素的删除观测map.insert返回值,方法123,已存在就报错,初始化方法4会覆盖 map的查找,异常处理 map容器的range返回两个迭代器 multimap案例,按照部门_增删员工信息 容器共性机制 把对象放到容器中,会自动执行拷贝构造函数 各个容器的使用时机 vector与deque的比较: 算法 算法基础 函数对象(仿函数) 函数对象 与普通函数的区别:--  相同之处 函数对象 与普通函数的区

STL算法设计理念 - 函数对象和函数对象当参数和返回值

函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)"的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待. 这是通过重载类的operator()来实现的. "在标准库中,函数对象被广泛地使用以获得弹性",标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为: demo #include <iostrea

STL 算法中函数对象和谓词

STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)"的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待.          这是通过重载类的operator()来实现的.          "在标准库中,函数对象被广泛地使用以获得弹性",标准库中的很多算法都可以使用函数

STL算法之函数copy

STL算法之copy copy(beg, end, dest) //dest表示输入迭代器 #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int myints[] = { 10, 20, 30, 40, 50, 60, 70 }; vector<int> myvector; vector<int>::iter

STL 算法[转 ]

STL 算法 STL算法概述 简介: STL算法部分主要由头文 件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包 含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象 注意: 编译器无法检测出所传递的迭代器是一个无效形式的迭代器,当然也无法给出算法函数错误的提示,因为迭代器并不是真实的类别,它只是

C++提高5 STL算法 :查找,统计,排序,拷贝,替换,算术,集合 |STL 案例:学校演讲比赛介绍

[本文谢绝转载] <大纲> STL 算法 查找算法 adjacent_find()查找容器中重复元素的首地址 distance()根据迭代器,返回元素的下标 binary_search()二分查找:在有序的序列 find   查找函数 find_if 自定义查找函数 统计算法 count 返回容器中相同元素的个数 cout_if 统计大于3的元素个数 排序算法 marge()对两个有序容器组合到另一个容器 sort 自定义排序 random_shuffle 随机洗牌 基本数据类型 random