// <numeric> 
template <class InputIterator, class T>
    T accumulate ( InputIterator first,
        InputIterator last, T init );
template <class InputIterator, class T,
    class BinaryOperation>
    T accumulate ( InputIterator first,
        InputIterator last, T init,
​        BinaryOperation binary_op );

累加范围中的元素。

该函数等价于:

template<class _InIt,
class _Ty,
class _Fn2> inline
    _Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func)
{	// return sum of _Val and all in [_First, _Last), using _Func
    for (; _First != _Last; ++_First)
        _Val = _Func(_Val, *_First);
    return (_Val);
}
  • firstlast

    分别指向一个序列中初始及末尾位置的输入迭代器(Input iterators)。这个范围即 [first,last) ,包括 first 到 last 间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。

    init

    用于累加的初始值。

    binary_op

    二元谓词(Binary)函数。

    该函数不能修改其参数。

    可以是函数指针(Function pointer)类型或函数对象(Function object)类型。

  • 返回初始值 init 与范围 [first,last) 中的所有元素累加后的结果。

  • 例 1

    #include <iostream>
    #include <numeric>
    #include <iterator>
    #include <vector>
    
    namespace ClassFoo{
        void Accumulate_1() {
            // 构造一个 vector 对象
            std::vector<int> foo;
            foo.push_back(1);
            foo.push_back(2);
            foo.push_back(3);
            foo.push_back(4);
            foo.push_back(5);
    
            // 在初始值 20 上累加所有元素
            int r = std::accumulate(foo.begin(), foo.end(), 20);
            std::cout << r << std::endl;
    
            // 使用减法
            r = std::accumulate(foo.begin(), foo.end(), 20, std::minus<int>());
            std::cout << r << std::endl;
        }
    }
    int main()
    {
        ClassFoo::Accumulate_1();
        return 0;
    }

    35
    5

  • 复杂度

    O(N)N 等值于 std::distance(first,last)

    数据争用相关

    访问在范围 [first,last) 中的所有元素,且每个元素确定只被访问一次。

    异常安全性相关

    如果谓词 binary_op、元素赋值操作或操作某个迭代器抛异常,该函数才会抛异常。

    注意 无效参数将导致未定义行为(Undefined behavior)