您好我希望(乘以,添加等)矢量的标量值,例如myv1 * 3
,我知道我可以用forloop做一个函数,但有没有办法使用STL函数执行此操作?类似于{Algorithm.h :: transform function}?
答案 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函数捕获的任何变量(例如,您想要与某个预定标量相乘),都会作为参考进入括号。