如何让 std::transform 的结果累积在数组上而不是重写它?

问题描述 投票:0回答:1

当我想计算两个数组

a
b
的成对乘积并将结果存储在另一个数组
c
中时,我可以使用
std::transform

long int length = 10000;
double* a = new double[length];
double* b = new double[length];
double* c = new double[length];
std::transform(a, a+length, b, c, std::multiplies<double>());

但是,在某些情况下,

c
已经包含重要数据,我希望结果累积在
c
上而不是重写它。 我知道可以通过这种方式使用额外的临时数组来完成:

double* tmp = new double[length];
std::transform(a, a+length, b, tmp, std::multiplies<double>());
std::transform(c, c+length, tmp, c, std::plus<double>());

但有时

length
可能非常大,因此制作额外的
tmp
数组非常昂贵。 有什么办法可以做到这一点而不需要
tmp
吗?

c++ arrays stl
1个回答
0
投票

您可以通过使用 lambda 作为传递给

transform
binary_op,在一次
transform
调用中完成所需的所有操作:

std::transform(a, a+3, b, c, [&](auto& itemOfAArray, auto& itemOfBArray)
{ 
    int cItemOffset = &itemOfAArray - a;
    return itemOfAArray*itemOfBArray + c[cItemOffset];
});

Lamba 捕获

c
数组。 Lambda 还通过引用获取其参数,因此它可以使用
c
数组的指针算术索引进行计算,并将乘法和累加的结果保存到其中。

© www.soinside.com 2019 - 2024. All rights reserved.