sch*_*312 7 c++ lambda accumulate
如果我想累积a的绝对值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);
}
Run Code Online (Sandbox Code Playgroud)
我想写
return std::accumulate(vec.begin(), vec.end(), 0, std::fabs());
Run Code Online (Sandbox Code Playgroud)
但是这并不能编译,因为与这两个参数的函数sum和value预期。
有没有更优雅的方式来写这个?我需要lambda吗?我可以摆脱它吗?
在C ++ 17之前
您基本上想做两件事:转换元素,然后对其求和。因为std::accumulate您必须告诉算法如何对元素求和,但是如果要转换元素,则需要做一些额外的事情。
您要编写的行仅告诉您如何转换元素(并且不会编译,因为accumulate期望函子添加的元素不会转换元素)。
TL; DR:否。如果要转换和添加元素,则必须同时进行。没有称为的算法transform_and_accumulate,因此您必须自己组合一些东西。
C ++ 17
上面的内容只有在C ++ 17之前才适用,它具有transform_reduce并且基本上可以满足您的需求。
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |