stdaccumulate

在标题 <numeric> 中定义

template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init); // (1)

template<class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation f); // (2)

功效:

std::accumulate 使用 f 函数对 [first, last) 执行折叠操作,以 init 为累加器值。

实际上它相当于:

T acc = init;
for (auto it = first; first != last; ++it)
    acc = f(acc, *it);
return acc;

在版本(1)中,使用 operator+代替 f,因此在容器上累积相当于容器元素的总和。

参数:

first, last - 应用 f 的范围。
init - 累加器的初始值。
f - 二进制折叠功能。

返回值:

f 应用的累计价值。

复杂:

O(n×k) ,其中 n 是从 firstlast 的距离, O(k)f 函数的复杂度。

例:

简单的例子:

std::vector<int> v { 2, 3, 4 };
auto sum = std::accumulate(v.begin(), v.end(), 1);
std::cout << sum << std::endl;

输出:

10

将数字转换为数字:

Version < C++ 11

class Converter {
public:
    int operator()(int a, int d) const { return a * 10 + d; }
};

然后

const int ds[3] = {1, 2, 3};
int n = std::accumulate(ds, ds + 3, 0, Converter());
std::cout << n << std::endl;

Version >= C++ 11

const std::vector<int> ds = {1, 2, 3};
int n = std::accumulate(ds.begin(), ds.end(),
                        0,
                        [](int a, int d) { return a * 10 + d; });
std::cout << n << std::endl;

输出:

123