Hans Hans - 10 months ago 51
C++ Question

STL way to add a constant value to a std::vector

Is there an algorithm in the standard library that can add a value to each element of a std::vector?
Something like

std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);

that adds the value 1.0 to each element?

If there isn't a nice (e.g. short, beautiful, easy to read) way to do this in STL, how about boost?

Answer Source

Take a look at std::for_each and std::transform. The latter accepts three iterators (the begin and end of a sequence, and the start of the output sequence) and a function object. There are a couple of ways to write this. One way, using nothing but standard stuff, is:

transform(myvec.begin(), myvec.end(), myvec.begin(),
          bind2nd(std::plus<double>(), 1.0));              

You can do it with for_each as well, but the default behavior of std::plus won't write the answer back to the original vector. In that case you have to write your own functor. Simple example follows:

struct AddVal
    double val;
    AddVal(double v) : val(v);

    void operator()(double &elem) const
        elem += v;

std::for_each(myvec.begin(), myvec.end(), AddVal(1.0));