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

Even shorter using lambda functions, if you use C++0x:

std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});

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));

The shortest way in plain C++0X is :

for(double& d : myvec)
  d += 1.0;

and with boost :

for_each(myvec, _1 += 1.0); // boost.range + boost.lambda

Tags:

C++

Stl