使用 accumulate 计算替代总和

Using accumulate to calculate alternate sum

如果我像下面这样在 C++ 中使用 accumulate 函数

 std::vector<int> v2{1, 2, 3, 4, 5};
 int sum = 0;
 std::cout << std::accumulate(v2.begin(), v2.end())

它将简单地对所有数字求和。但是我想计算 1-2+3-4+5
我在想办法分别累加1,3,5和2,4然后做
但不确定如何使用 accumulate 来实现。

这是我的快速解决方案:

int sign = -1; // start with minus first (e.g. 1-2)
std::vector<int> values{ 1, 2, 3, 4, 5 };

auto value = std::accumulate(values.begin(), values.end(), 0, [&sign](int total, int value)
{ 
    sign = -sign;  
    return total + (sign)*value;
});

I wanted to calculate 1-2+3-4+5

I was thinking of some way to accumulate 1,3,5 and 2,4 separately and then do it

这是解决问题的一个很好的方法。标准库还没有 stride 视图(虽然它有 drop),你可以写

int sum = accumulate(v2 | stride(2), 0) -
          accumulate(v2 | drop(1) | stride(2), 0);

在添加 stride 之前,您可以使用 range-V3 库执行此操作。

std::accumulate我根本懒得用,不太合适。相反,只需使用两个循环:

int result = 0;
size_t n = v2.size ();
for (size_t i = 0; i < n; i += 2)
    result  += v2 [i];
for (size_t i = 1; i < n; i += 2)
    result -= v2 [i];