You need a closure.
float tot = std::accumulate(weights.begin(), weights.end(), 0);
std::transform(weights.begin(), weights.end(), [tot](float x)->float{return(x/tot);});
In this case tot is captured by value. C++11 lambdas support capturing by:
- value
[x] - reference
[&x] - any variable currently in scope by reference
[&] - same as 3, but by value
[=]
You can mix any of the above in a comma separated list [x, &y].