Multiply vector elements by a scalar value using STL

后端 未结 5 1089
刺人心
刺人心 2020-12-23 14:03

Hi I want to (multiply,add,etc) vector by scalar value for example myv1 * 3 , I know I can do a function with a forloop , but is there a way of doing this using

相关标签:
5条回答
  • 2020-12-23 14:17

    Yes, using std::transform:

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

    Before C++17 you could use std::bind1st(), which was deprecated in C++11.

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

    For the placeholders;

    #include <functional> 
    
    0 讨论(0)
  • 2020-12-23 14:20

    I know this not STL as you want, but it is something you can adapt as different needs arise.

    Below is a template you can use to calculate; 'func' would be the function you want to do: multiply, add, and so on; 'parm' is the second parameter to the 'func'. You can easily extend this to take different func's with more parms of varied types.

    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 */
    

    Also, this is not a 'safe' function, you must do type/value-checking etc. before you use it.

    0 讨论(0)
  • 2020-12-23 14:29

    Mordern C++ solution for your question.

    std::vector<double> myarray;
    double myconstant{3.3};
    std::transform(myarray.begin(), myarray.end(), myarray.begin(), [&myconstant](auto& c){return c*myconstant;});
    
    0 讨论(0)
  • 2020-12-23 14:31

    If you can use a valarray instead of a vector, it has builtin operators for doing a scalar multiplication.

    v *= 3;
    

    If you have to use a vector, you can indeed use transform to do the job:

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

    (assuming you have something similar to Boost.Lambda that allows you to easily create anonymous function objects like _1 * 3 :-P)

    0 讨论(0)
  • 2020-12-23 14:39

    I think for_each is very apt when you want to traverse a vector and manipulate each element according to some pattern, in this case a simple lambda would suffice:

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

    note that any variable you want to capture for the lambda function to use (say that you e.g. wanted to multiply with some predetermined scalar), goes into the bracket as a reference.

    0 讨论(0)
提交回复
热议问题