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

时间:2010-10-07 19:18:20

标签: c++ stl vector element operation

您好我希望(乘以,添加等)矢量的标量值,例如myv1 * 3,我知道我可以用forloop做一个函数,但有没有办法使用STL函数执行此操作?类似于{Algorithm.h :: transform function}?

5 个答案:

答案 0 :(得分:81)

是的,使用std::transform

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

在C ++ 17之前,您可以使用{C} 11中不推荐使用的std::bind1st()

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

对于占位符;

#include <functional> 

答案 1 :(得分:23)

如果您可以使用valarray而不是vector,则它具有用于进行标量乘法的内置运算符。

v *= 3;

如果您必须使用vector,您确实可以使用transform来完成这项工作:

transform(v.begin(), v.end(), v.begin(), _1 * 3);

(假设你有类似于Boost.Lambda的东西,可以让你轻松创建像_1 * 3这样的匿名函数对象:-P)

答案 2 :(得分:6)

您的问题的现代C ++解决方案。

std::vector<double> myarray;
double myconstant{3.3};
std::transform(myarray.begin(), myarray.end(), myarray.begin(), [myconstant](auto& c){return c*myconstant;});

答案 3 :(得分:-1)

我知道这不是你想要的STL,但是你可以根据不同的需求进行调整。

以下是您可以用来计算的模板; 'func'将是你想要做的功能:乘法,加法等等; 'parm'是'func'的第二个参数。您可以轻松扩展此功能,以使用不同类型的更多参数来获取不同的功能。

template<typename _ITStart, typename _ITEnd, typename _Func , typename _Value >
_ITStart xform(_ITStart its, _ITEnd ite, _Func func, _Value parm)
{
    while (its != ite) { *its = func(*its, parm); its++; }
    return its;
}
...

int mul(int a, int b) { return a*b; }

vector< int > v;

xform(v.begin(), v.end(), mul, 3); /* will multiply each element of v by 3 */

此外,这不是一个“安全”功能,您必须在使用之前进行类型/值检查等。

答案 4 :(得分:-1)

我认为for_each非常适合你想要遍历一个向量并根据某种模式操纵每个元素,在这种情况下一个简单的lambda就足够了:

std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });

请注意,要为lambda函数捕获的任何变量(例如,您想要与某个预定标量相乘),都会作为参考进入括号。