累积向量的绝对值

sch*_*312 7 c++ lambda accumulate

如果我想累积a的绝对值std::vector,则可以使用lambda来计算绝对值并将其添加到std::accumulatelive demo)的总和中。

#include <numeric>
#include <vector>

int main (){
    std::vector<int> vec {1,2,3,-4};
    auto abs_val =[](auto val, auto sum){return sum + std::fabs(val);};
    return std::accumulate(vec.begin(), vec.end(), 0, abs_val);
}
Run Code Online (Sandbox Code Playgroud)

我想写

    return std::accumulate(vec.begin(), vec.end(), 0, std::fabs());
Run Code Online (Sandbox Code Playgroud)

但是这并不能编译,因为与这两个参数的函数sumvalue预期。

有没有更优雅的方式来写这个?我需要lambda吗?我可以摆脱它吗?

for*_*818 6

在C ++ 17之前

您基本上想做两件事:转换元素,然后对其求和。因为std::accumulate您必须告诉算法如何对元素求和,但是如果要转换元素,则需要做一些额外的事情。

您要编写的行仅告诉您如何转换元素(并且不会编译,因为accumulate期望函子添加的元素不会转换元素)。

TL; DR:否。如果要转换和添加元素,则必须同时进行。没有称为的算法transform_and_accumulate,因此您必须自己组合一些东西。

C ++ 17

上面的内容只有在C ++ 17之前才适用,它具有transform_reduce并且基本上可以满足您的需求。