c++ - microsoft - visual studio installer
Forma de STL para agregar un valor constante a un std:: vector (5)
¿Hay un algoritmo en la biblioteca estándar que pueda agregar un valor a cada elemento de un std :: vector? Algo como
std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);
que agrega el valor 1.0 a cada elemento?
Si no hay una buena manera (por ejemplo, corta, hermosa, fácil de leer) de hacer esto en STL, ¿qué tal un impulso?
Eche un vistazo a std::for_each
y std::transform
. Este último acepta tres iteradores (el comienzo y el final de una secuencia, y el inicio de la secuencia de salida) y un objeto de función. Hay un par de formas de escribir esto. Una forma, usando nada más que cosas estándar, es:
transform(myvec.begin(), myvec.end(), myvec.begin(),
bind2nd(std::plus<double>(), 1.0));
También puede hacerlo con for_each
, pero el comportamiento predeterminado de std::plus
no devolverá la respuesta al vector original. En ese caso, debes escribir tu propio functor. El ejemplo simple sigue:
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));
El camino más corto en C ++ 0X es:
for(double& d : myvec)
d += 1.0;
y con impulso:
for_each(myvec, _1 += 1.0); // boost.range + boost.lambda
Incluso más corto usando funciones lambda, si usas C ++ 0x:
std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});
Si le interesa realizar muchas <valarray>
matemáticas en vectores, le <valarray>
parte <valarray>
de la biblioteca estándar. Básicamente es un std::vector<>
diseñado para cálculos numéricos vectoriales (sectores, funciones matemáticas, operadores de puntos, etc.).
La única parte que realmente apesta es que no tiene conversiones fáciles desde y hacia std::vector<>
.
std::transform( myvec.begin(), myvec.end(),
myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );