如果我想累积std::vector的绝对值,则可以使用lambda来计算绝对值,并将其添加到std::accumulate(live 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);
}

我想写
    return std::accumulate(vec.begin(), vec.end(), 0, std::fabs());

但这不会编译,因为期望使用带有两个参数sumvalue的函数。

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

最佳答案

在C++ 17之前

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

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

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

C++ 17

以上仅适用于C++ 17,它具有 transform_reduce ,基本上可以满足您的需求。

关于c++ - 累积 vector 的绝对值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58266717/

10-09 13:36