std::transform 以两个 std::vector 和一个常量作为参数

Joh*_*ohn 6 c++ lambda transform stdvector c++11

我想使用 std::transform 做一些类似于 binary_op 的事情,但有一个附加常量,例如,获得两个向量的乘积: x1 = (10,20,30,40,50) 和 x2 = (2, 4,6,8,10),我们可以写:

#include <iostream>
#include <algorithm>
#include <vector>


double multiply(double x, double y){
    return x*y;
}

int main () {
  std::vector<int> x1;
  std::vector<int> x2;


  for (int i=1; i<6; i++)
    x1.push_back (i*10); //10,20,30,40,50

  for (int i=1; i<6; i++)
    x2.push_back (i*2);  //2,4,6,8,10



  std::transform (x1.begin(), x1.end(), x2.begin(), x1.begin(),multiply);


  for (std::vector<int>::iterator it=x1.begin(); it!=x1.end(); ++it)
    std::cout << ' ' << *it;
  //output: 20,80,180,320,500

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将 x1 和 x2 按元素相乘并返回 (20,80,180,320,500)。

但是,如果我想计算 x1 $\dot$ x2 + c,其中 c 是标量常数,例如 1,如下函数所示:

double multiply(double x, double y, double c){
    return x*y + c;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我如何使用 std::transform 应用于两个向量 x1 和 x2?我是否必须使标量常数 c 成为具有相同元素的向量,例如 (c,c,c...c)?

提前致谢。

art*_*ona 6

尝试这个

int c = 20;
std::transform (x1.begin(), x1.end(), x2.begin(), x1.begin(),[&c](auto i, auto j) { return  multiply(i,j) + c ; });
Run Code Online (Sandbox Code Playgroud)

是lambda函数;i 是 x1 中的元素,j 是 x2 中的元素。[&] 表示通过引用捕获 lambda 外部定义的所有值。