使用 STL 将向量元素乘以标量值

新手上路,请多包涵

嗨,我想(乘、加等)向量按标量值,例如 myv1 * 3 ,我知道我可以用 forloop 做一个函数,但是有没有办法使用 STL 函数来做到这一点? {Algorithm.h :: 变换函数}之类的东西?

原文由 Ismail Marmoush 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

是的,使用 std::transform

 std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind(std::multiplies<T>(), std::placeholders::_1, 3));

在 C++17 之前,您可以使用 std::bind1st() ,这在 C++11 中已被弃用。

 std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind1st(std::multiplies<T>(), 3));

对于占位符;

 #include <functional>

原文由 Oliver Charlesworth 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您必须将结果存储在 新的 vector 中,那么您可以使用来自 std::transform() <algorithm> 标头的 --- :

 #include <algorithm>
#include <vector>

int main() {
    const double scale = 2;
    std::vector<double> vec_input{1, 2, 3};
    std::vector<double> vec_output(3); // a vector of 3 elements, Initialized to zero
    // ~~~
    std::transform(vec_input.begin(), vec_input.end(), vec_output.begin(),
                   [&scale](double element) { return element *= scale; });
    // ~~~
    return 0;
}

所以,我们在这里要说的是,

  • 将 --- 的值( element s) vec_inputvec_input.begin() )到结束( vec_input.begin()
    • 本质上,使用前两个参数,您指定要转换的元素范围( [beginning, end) ),范围
  • 将每个 element 传递给最后一个参数,lambda 表达式,
  • 获取 lambda 表达式的输出并将其放入 vec_output 从头开始( vec_output.begin() )。
    • 第三个参数是指定目标向量的开始。

拉姆达表达式

  • 通过引用从外部捕获比例因子 ( [&scale] ) 的值,
  • 将 double 类型的向量元素作为其输入(由 std::transform() 传递给它)
  • 在函数体中,它返回最终结果,
    • 正如我上面提到的,它将因此存储在 vec_input 中。

最后说明:虽然没有必要,但您可以通过以下 lambda 表达式:

 [&scale](double element) -> double { return element *= scale; }

它明确指出 lambda 表达式的输出是双精度数。但是,我们可以省略它,因为在这种情况下,编译器可以自己推断返回类型。

原文由 Ali 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题