如果我想累积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());
但这不会编译,因为期望使用带有两个参数
sum
和value
的函数。有没有更优雅的方式来写这个?我需要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/