当我想计算两个数组
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
吗?
您可以通过使用 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
数组的指针算术索引进行计算,并将乘法和累加的结果保存到其中。