累积向量的绝对值
Accumulate absolute values of a vector
如果我想累积std::vector
的绝对值,我可以使用 lambda 计算绝对值并将其添加到std::accumulate
的总和(现场演示(。
#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;大卫:没有。如果要转换和添加元素,则必须同时执行这两项操作。没有叫做transform_and_accumulate
的算法,所以你必须自己组合一些东西。
C++17
以上情况仅在 C++17 之前是正确的,它有transform_reduce
,基本上可以满足您的需求。
您希望通过晶圆厂的方式存在两个问题。第一个是微不足道的,另一个稍微复杂一些。您显示的代码无法正常工作,因为您正在尝试调用 fabs 并将结果传递给 std::accumulate(浮点数或双精度数(:
std::accumulate(vec.begin(), vec.end(), 0, std::fabs()); //note the parens ()
因此,如果 std::fabs 只是一个函数并使用正确的签名,这将起作用:
std::accumulate(vec.begin(), vec.end(), 0, std::fabs);
然而,正如这里所见,fabs 在浮点、双精度和长双精度上重载,这意味着 std::fabs 是一个重载集,而不是一个单一函数,因此不清楚你想传递哪个版本地址。这部分问题在这里有一个答案:如何指定指向重载函数的指针?
此外,如注释和其他答案中所述,累加最后一个参数期望结合两个值的二进制操作,而晶圆厂仅取一个绝对值。使用的正确算法是 C++17 的transform_reduce:
std::transform_reduce(vec.begin(), vec.end(),0,std::plus<>{}, static_cast<double (*)(double)>(std::fabs));
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 累积向量的绝对值
- 如何计算特征向量的绝对值