accumulate
//版本1
template <typename InputIterator, typename T>
T accumulate(InputIterator first, InputIterator last, T init) {
for ( ; first != last; ++first)
init = init + *first;
return init;
}
//版本2
template <typename InpurIterator, typename T, typename BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation op) {
for ( ; first != last; ++first)
init = op(init, *first);
return init;
}
STL算法accumulate用来计算init和[first, last)内所有元素的总和,需要提供初始值init。accumulate有两个版本,版本2需要提供一个二元操作符,在C++11之前这个二元操作符不能是side effect的,C++11后取消了这一约束,只规定操作符不得使任何迭代器(包括尾后迭代器)失效,也不能修改所涉及范围内的任何元素。
对于版本2需要提供的二元操作符,可以是自定义的函数或仿函数,也可以使用标准库functional中给出的几种常用二元操作符,如加、减、乘、除、取模等。
#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
int double_op(int x, int y) {
return x+2*y;
}
template <typename T>
struct double_obj {
T operator()(T x, T y) {
return x+2*y;
}
};
int main()
{
using std::cout;
using std::accumulate;
using std::endl;
std::vector<int> iv = {1, 2, 3, 4, 5};
cout << accumulate(iv.begin(), iv.end(), 0) << endl;
cout << accumulate(iv.begin(), iv.end(), 0, double_op) << endl;
cout << accumulate(iv.begin(), iv.end(), 0